2013-07-04 199 views
2

某些头文件出现在/src/dir1/(例如:a.h,b.h,c.h等)。我的源文件存在于/src/dir2/file.cpp。我使用了/src/dir1/中存在的一些头文件,但在编译过程中出现了像header file not found这样的错误。c/C++:找不到头文件

然后我改变了像#include "../src/dir1/a.h"这样的包含路径,然后错误消失了file.cpp,但是我在/src/dir1的头文件中出现了not found错误。因为我包含头文件say a.ha.h包含一些其他头文件,出现在/src/dir1/(说b.hc.h存在于a.h)。

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

注意:我正在使用scons来构建。

+2

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

回答

3

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

gcc -I/src/dir1 file.cpp 
+0

这就是gcc特定的SCons适用于各种编译器。 – LogicG8

+1

POSIX需要'-I'选项; 'gcc'实现它。我不知道编译器在哪里不支持 - AFAIK,甚至MSVC支持'-I'(可能是'/ I')。 –

2

SCons FAQ

我怎么SCons的找到我的#include文件?

如果您的程序在各种目录中包含#include文件,SCons必须以某种方式告诉它应该在哪些目录中查找#include文件。

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

SCons的将添加到编辑命令行(S)右-I选项,或:你是CPPPATH变量设置为包含您要搜索.h文件目录列表做任何类似的选项都适用于您正在使用的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”文件。

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

要看到自己这一点,让DIR1当前目录(CHDIR/src目录/ DIR1)和比较“ls ..”和“ls ../src”之间的区别。第二个LS不会工作,但第一个会。

有意义吗?希望对你有帮助