g ++包含其他目录中的文件

时间:2015-05-27 16:54:04

标签: c++ c compilation linker g++

我在名为test的目录中有一个main.cpp文件,其中包含

#include "INIReader.h"

文件的结构如下所示

---/test/main.cpp

---/inih/ini.h
         ini.c

---/inih/cpp/INIReader.h
             INIReader.cpp

INIReader.cpp 包括

#include "../ini.h"
#include "INIReader.h"

我正在尝试使用

在一行中编译 main.cpp
g++ -o test -Wall -I../inih/cpp main.cpp

但它不起作用。像

这样的错误
> Undefined symbols for architecture x86_64: 
>... REFERENCES TO stuff in INIReader ...
>ld: symbol(s) not found
> for architecture x86_64 clang: error: linker command failed with exit
> code 1 (use -v to see invocation)

出现。

现在我正在通过运行命令进行编译,它将起作用。

> g++ -c -Wall ../inih/cpp/INIReader.cpp 
> g++ -c -Wall ../inih/ini.c 
> g++ -c -Wall -I../inih/cpp main.cpp 
> g++ -o configtest main.o INIReader.o ini.o

我认为g ++编译器将在每个默认包含目录和传递的 -I 目录中查找每个#include,并且不知道为什么上面的一个内联不起作用。将g ++"跟随"包含在 ./ ini.h 等所有文件中?我无法找到学习这个的好资源。 如何将这些命令组合成一行,就像上一个命令一样?谢谢。

编辑:

我看过"重复"问题,但不明白它与我的问题有什么关系。我正在努力寻找一个很好的资源来学习如何"包括"正确使用g ++并知道为什么我当前的一个班轮不起作用。 这不是代码中的问题,因为编译然后逐个链接是成功的!

重复的问题类似,但未涵盖其他目录中的文件。

1 个答案:

答案 0 :(得分:2)

您获得的错误来自链接器步骤,而不是编译器步骤。它与您的包含没有任何关系。您需要告诉链接器生成目标二进制文件所需的所有文件。正如在this answer中所说的,这可能是以前作为副本关闭的问题,您只需要在命令行中列出main之后的所有cpp文件。所以对于你的,命令行应该是这样的:

g++ -o configtest -Wall -I../inih/cpp main.cpp ../inih/cpp/INIReader.cpp ../inih/ini.c

一旦开始一步编译所有文件,您可能需要添加额外的include指令来查找不同路径中的头文件,因此您的命令行可能需要:

g++ -o configtest -Wall -I../inih/cpp -I../inih main.cpp ../inih/cpp/INIReader.cpp ../inih/ini.c

但这取决于您如何在源文件中包含标题...