【问题标题】:c/c++ : header file not foundc/c++:找不到头文件
【发布时间】:2013-07-04 16:58:52
【问题描述】:

/src/dir1/ 中存在一些头文件(例如:a.hb.hc.h 等)。我的源文件存在于/src/dir2/file.cpp。我使用了/src/dir1/ 中存在的一些头文件,但在编译过程中出现header file not found 之类的错误。

然后我更改了 #include "../src/dir1/a.h" 之类的包含路径,然后 file.cpp 中的错误消失了,但在 /src/dir1 中存在的头文件中出现 not found 错误。因为我包含了头文件,比如a.h,所以a.h 包含了/src/dir1/ 中存在的一些其他头文件(比如b.hc.h 存在于a.h)。

如何在/src/dir2/file.cpp 中添加头文件(a.h),使其不要求修改/src/dir1/ 中存在的头文件中的包含路径?

注意:我使用scons 构建。

【问题讨论】:

  • 您需要"include "../dir1/a.h"#include "../..src/dir1/a.h" 才能找到该文件。但是在包含路径中嵌入.. 是一个坏主意(就像使用绝对路径名一样)。编译时使用#include "a.h"#include "dir1/a.h" 和适当的-I 命令行选项。

标签: c++ c include


【解决方案1】:

您可以使用gcc-I命令行参数将目录添加到包含文件搜索路径:

gcc -I/src/dir1 file.cpp

【讨论】:

  • POSIX 需要-I 选项; gcc 实现它。我不知道不支持它的编译器——AFAIK,甚至 MSVC 都支持-I(可能是/I)。
【解决方案2】:

SCons FAQ:

如何让 SCons 找到我的#include 文件?

如果您的程序在不同的目录中有#include 文件,则必须以某种方式告诉 SCons 它应该在哪些目录中查找#include 文件。为此,您可以将 CPPPATH 变量设置为包含要搜索的 .h 文件的目录列表:

env = Environment(CPPPATH='inc')
env.Program('foo', 'foo.c') 

SCons 将在编译命令行中添加正确的 -I 选项,或者任何适合您正在使用的 C 或 C++ 编译器的类似选项。这使您的基于 SCons 的构建配置具有可移植性。

请特别注意,您不应该像最初预期的那样直接在 CCFLAGS 变量中设置包含目录:

env = Environment(CCFLAGS='-Iinc')    # THIS IS INCORRECT!
env.Program('foo', 'foo.c') 

这将使程序正确编译,但 SCons 不会在“inc”子目录中找到依赖项,并且如果其中任何一个 #include 文件发生更改,程序将不会重新构建。

【讨论】:

    【解决方案3】:

    找不到,因为它不存在。你有一个额外的间接级别。 “/src/foo/”中的文件将在“/src/bar/”中包含一个带有“include ../bar/the_file”的文件

    换句话说,在您的示例中,相对于 dir1 或 dir2 没有“../src/”。关系是“dir1/../dir2”或“dir1/../../src/dir2”

    要亲自查看,请将 dir1 设为当前目录 (chdir /src/dir1) 并比较“ls ..”和“ls ../src”之间的差异。第二个 ls 不起作用,但第一个会。

    有意义吗?希望有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-29
      • 2021-12-12
      相关资源
      最近更新 更多