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

g++ include files in other directories

我在名为 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++ "follow" 会包含在所有文件中,例如 ./ini.h 吗?我一直没能找到学习这个的好资源。 我怎样才能像上一个命令一样将这些命令组合成一行?谢谢。

编辑:

我查看了 "duplicate" 问题,但不明白它与我的问题有什么关系。我正在尝试找到一个很好的资源来学习如何使用 g++ 正确 "include" 并知道为什么我当前的一个衬垫不起作用。 不是代码的问题,编译成功,然后一一链接!

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

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

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

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

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

但这取决于您如何从源文件中包含 header...