包含来自第 3 方的头文件,该文件目前位于 Linux 服务器上的多个路径中

问题描述 投票:0回答:1

平台: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++ c makefile header-files
1个回答
0
投票

预处理器查找包含文件的方式是由 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"
© www.soinside.com 2019 - 2024. All rights reserved.