【发布时间】:2021-11-22 10:06:07
【问题描述】:
我正在尝试使用本地 ../include/records 目录中包含文件的临时版本来构建一些代码。原始文件位于 /home/apps/include/records 中。我将 gcc 命令设置为在 /home/apps/include 之前搜索 ../include,但它仍在从 /home/apps/include 获取原始模块并报告错误。如果我在 /home/apps/include 中重命名原始文件,那么 gcc 会选择我在本地编辑的副本并编译干净。那么,包含顺序是怎么回事……?这种“本地包含优先”逻辑过去一直对我有用,但这可能是我从 AIX 迁移到 Linux 后第一次使用它。
除了 -I 命令行选项的顺序之外,是否有其他东西可以覆盖所请求的包含顺序?
源模块包含语句为:
#include "records/novarec.h"
gcc 命令行如下所示:
$make
gcc -DLINUX64 -c -g -I. -I../include -I/home/apps/include -I/home/apps/include/em -I/home/apps/include/odbc -Wno-implicit-function-declaration -Wno-implicit-int -Wno-format-security -Wno-format-truncation -Wno-discarded-qualifiers novaget.c
编译器抱怨我的本地 novarec.h 副本中有一个未定义的值,但在生产 /home/apps/include/records/novarec.h 中没有:
novaget.c: In function ‘calcComscoreDemoV1’:
novaget.c:2651:15: error: ‘CSCD_W21_49’ undeclared (first use in this function); did you mean ‘CSCD_W25_49’?
fval = *(dm+CSCD_W21_49);
^~~~~~~~~~~
【问题讨论】:
-
在 Linux 上如何处理包含文件并没有什么独特之处。您向我们提供了原始文件的完整路径名,但没有提供本地副本的路径。我怀疑本地副本是
../include/novarec.h,而应该是../include/records/novarec.h。如果是后者,请查看文件和目录权限。如果这些都没有帮助,您可以将-v -E -dD选项添加到编译行并查看发生了什么。 -
novarec 的路径是正确的 (../include/records/novarec.h)。但是 -v -E -dD 标志出现了一些有趣的东西:它在 /home 中显示了另一个包含文件/apps/include 还拉入“records/novarec.h”,并从 /home/apps/include/records 获取它。那么,是否有可能因为 gcc 从 /home/apps/include 拉入 file1.h,所以当 file1.h 包含它时,它使用该包含路径拉入 file2.h?