如何在VC ++项目中强制执行其他包含文件搜索顺序?

时间:2015-08-24 13:44:13

标签: c++ c visual-studio

例如,我有两个 header.h 文件位于两个不同的目录 include1 include2 。 我的源代码文件使用常规包含,但没有指定确切的位置,如下所示:

#include "header.h"

在项目配置中,我将 include1 include2 文件夹设置为其他包含目录列表。

问题是当我构建项目时,每次都会选择 include1 文件夹,无论我在附加包含列表中定义它们的顺序如何。

有没有办法强制执行搜索顺序,如果我想要一个特定的文件夹或特定的头文件,而不是另一个,如果它们都有相同的文件名?

2 个答案:

答案 0 :(得分:9)

包含顺序(由MS作为documented)是:

  

编译器按以下顺序搜索目录:
   1.包含源文件的目录    2.使用/ I选项指定的目录,按照CL遇到它们的顺序    3. INCLUDE环境变量中指定的目录。

所以它实际上取决于声明包含目录的位置。如果它们都使用/ I选项指定(在配置属性> C / C ++> General>附加包含目录下的GUI中),则指定的顺序是搜索的顺序。如果目录位于INCLUDE环境变量中(在Configuration Properties> VC ++目录下的GUI中),则它取决于它们声明的位置。如果它属于属性表,那么您必须继承它们并按所需顺序自己声明它们(和其他继承的目录)。

答案 1 :(得分:0)

我认为你的问题很难解决。我怀疑header.h包含在文件夹include1中的文件中。

这意味着标准C包含路径

  1. 源文件的目录(或包含子文件的头文件)。
  2. 命令行定义的顺序包括。
  3. 所以要解决这个问题,我们需要能够(以某种方式)阻止规则1被解雇。

    如果您不关心修改源代码,使用#include "projecta/header.h"和#include "projectb/header.h"是实现此目的的常用方法。

    在您的情况下,您要确保(包括include2。)

    您可以申请的方法。

    如果可修改早期代码(.c / .cpp文件),则确保满足#include "include2/header.h" - which should also set up so all requirements for include1 / header.h`。

    如果include1/header.h有一个包含保护(#if ! defined( H_HEADER_H)),那么在命令行(/DH_HEADER_H)定义它,所以它不包括在内 - 这是一个黑暗的刺,如该文件无法实现其目的。

    编写文本修改脚本(sed?)以将“header.h”修改为“include2 / header.h” - 这可确保源中的所有实例选择您的版本。这不是你的规范,但可以设想为保持源不变,因为这将是一个预编译步骤。

    保证更改包含顺序的目标可以通过创建2个单独的项目来实现 - 一个使用include1/header.h而原始代码不变。然后提供include2/header.h作为其界面,以某种方式进行修改。