如何在 VC++ 项目中强制附加包含文件搜索顺序?

Posted

技术标签:

【中文标题】如何在 VC++ 项目中强制附加包含文件搜索顺序?【英文标题】:How to enforce additional include files search order in VC++ project? 【发布时间】:2015-08-24 13:44:12 【问题描述】:

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

#include "header.h"

在项目配置中,我将 include1include2 文件夹都设置在附加的包含目录列表中。

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

如果我想使用特定文件夹或特定头文件而不是另一个,如果它们都具有相同的文件名,是否有任何方法可以强制执行搜索顺序?

【问题讨论】:

这种歧义很可能应该以其他方式解决。如果您想在同一个项目中同时使用这两个标头怎么办?例如,如果您将它们放入目录中,它将解决此问题。所以会有一个#include "Folder1\header.h" 和Folder2 版本, 我想要实现的是用我自己的头文件替换现有 C 项目的头文件,而不触及原始文件(因此原始头文件中没有 ifdefs,并且没有更改源中的#include 指令)。简单的方法是根本不使用带有那个原始头文件的目录,但它还有一些我不需要替换的其他原始头文件。 有一个项目范围的设置“C++ 目录”可能在“其他目录”之前搜索。如果你把你的Folder1加在主列表的前面,肯定会先被搜索到。 不,这也不行。 什么版本的 Visual Studio? 【参考方案1】:

包含顺序(如 MS 的 documented)是:

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

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

【讨论】:

我遇到了与 OP 类似的问题,两个文件在不同的目录中具有相同的名称。我的问题是包含其他 .props 文件的 .props 文件的顺序错误。我想要的包含目录的 .props 文件需要最后导入,然后在 CL 和 RC 的 /I 选项中首先列出。【参考方案2】:

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

这意味着标准的C包含路径是

    源文件(或包含子文件的头文件)的目录。 命令行定义的顺序包括。

因此,要解决此问题,我们需要能够(以某种方式)阻止规则 1 触发。

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

在您的情况下,您希望确保您的 (include2 包括在内。)

你可以应用的方法。

如果早期的代码(.c/.cpp 文件)是可修改的,那么请确保您对#include "include2/header.h" - which should also set up so all requirements forinclude1/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作为它的接口,以某种方式修改。

【讨论】:

以上是关于如何在 VC++ 项目中强制附加包含文件搜索顺序?的主要内容,如果未能解决你的问题,请参考以下文章

在 VC++(VS2010) 项目输出中包含 DLL

VC包含目录附加依赖项库目录及具体设置

如何在 vc 6.0 中使用 smtp 附加 txt 文件

vc中的rc和rc2的区别

静态库中的 VC++ 资源

附加依赖项库目录包含目录