我在名为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.cppg++ -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 ++并知道为什么我当前的一个班轮不起作用。 这不是代码中的问题,因为编译然后逐个链接是成功的!
重复的问题类似,但未涵盖其他目录中的文件。
答案 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
但这取决于您如何在源文件中包含标题...