平台:Linux
场景是这样的: 我有两个模块。假设 X 和 Y 位于路径 /home/testuser/Test_CO/ 我在 X 中有一个 C++ 文件,其中包含一个文件“aaa.h”,该文件存在于 2 个路径中。
一个是 “/home/testuser/Test_CO/Y/abc/include/”
还有其他
“/usr/include/abc/”。
从 Y 包含的路径已在 makefile 中提及,但不是从 Y 中选取,而是从“/usr/include/abc/”路径中选取
生成文件
导出TAG=home/testuser/Test_CO/
INCFLAG +=
-I$(标签)/Y/abc/包括/
现在来到 X 中的 cpp 头文件,其中包含 aaa.h,如下所示:
#include“aaa.h”
但是当我像这样将上面的语句更改为 Y 内的头文件时,它工作正常
#include“../Y/abc/include/aaa.h”
如何在不更改上面的 include 语句的情况下使其包含?
预处理器查找包含文件的方式是由 C 标准实现定义的,这意味着该行为特定于给定的编译器。但是,通常(例如 gcc)
#include "aaa.h"
将搜索相对于包含 include 指令的源文件的路径的文件。
因此,指定一个相对路径,如
#include "../Y/abc/include/aaa.h"
可用于将预处理器定向到特定位置。
如果相对于当前路径没有找到包含文件,则按照给定的顺序搜索命令行上指定的包含路径。因此,如果 include 指令仅提供文件名:
#include "aaa.h"
并且在与源文件相同的路径中找不到该文件,则从命令行提供的第一个路径中获取文件,在这种情况下它必须是
/usr/include/abc/
。
因此,从
/home/testuser/Test_CO/Y/abc/include/
获取文件的唯一方法是更改命令行,使 -I /home/testuser/Test_CO/Y/abc/include/
出现在 -I /usr/include/abc
之前。
但是,如果源文件需要包含
/usr/include/abc
中找到的版本,那么这样做通常会导致问题,然后该版本将被遮盖。
如果无法避免使用相同名称的头文件,那么最好的选择通常是使用部分路径指定文件,这也将使代码读者更清楚实际包含哪个文件。
在这种情况下,可以通过在命令行中使用
-I /home/testuser/Test_CO/Y
并通过 包含文件来完成
#include "abc/include/aaa.h"