如何在 VC++ 项目中强制附加包含文件搜索顺序?
Posted
技术标签:
【中文标题】如何在 VC++ 项目中强制附加包含文件搜索顺序?【英文标题】:How to enforce additional include files search order in VC++ project? 【发布时间】:2015-08-24 13:44:12 【问题描述】:例如,我有两个 header.h 文件位于两个不同的目录 include1 和 include2 中。 我的源代码文件使用不指定确切位置的常规包含,如下所示:
#include "header.h"
在项目配置中,我将 include1 和 include2 文件夹都设置在附加的包含目录列表中。
问题是当我构建我的项目时,每次都会选择 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 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
作为它的接口,以某种方式修改。
【讨论】:
以上是关于如何在 VC++ 项目中强制附加包含文件搜索顺序?的主要内容,如果未能解决你的问题,请参考以下文章