0

我使用 XCode 编写了我的程序。它在 Mac 上运行没有任何问题。有人告诉我,我们的项目将在 Linux 机器上编译,所以我想在提交之前确保它在 Linux 上工作。当我尝试在 Linux 上编译时,它给了我一些参考错误:

/tmp/cckwoehj.o: In function `main':
main.cpp:(.text+0x9): undefined reference to `ReadFile()'
/tmp/cckwoehj.o: In function `leftSearch(NODE*, int)':
main.cpp:(.text+0x38b): undefined reference to `conflict(int**)'
main.cpp:(.text+0x3ca): undefined reference to `removeAllRowsWithLiteral(int**, int)'
main.cpp:(.text+0x3ec): undefined reference to `removeAllSpecifiedLiteral(int**, int)'
main.cpp:(.text+0x4ec): undefined reference to `conflict(int**)'
main.cpp:(.text+0x522): undefined reference to `unitPropagation(int**)'
main.cpp:(.text+0x538): undefined reference to `conflict(int**)'
/tmp/cckwoehj.o: In function `rightSearch(NODE*, int)':
main.cpp:(.text+0x992): undefined reference to `conflict(int**)'
main.cpp:(.text+0x9d4): undefined reference to `removeAllRowsWithLiteral(int**, int)'
main.cpp:(.text+0x9f3): undefined reference to `removeAllSpecifiedLiteral(int**, int)'
main.cpp:(.text+0xaf3): undefined reference to `conflict(int**)'
main.cpp:(.text+0xb29): undefined reference to `unitPropagation(int**)'
main.cpp:(.text+0xb3f): undefined reference to `conflict(int**)'
collect2: ld returned 1 exit status

我在网上找到的东西都是关于模板的。我不使用模板。我还发现了一个关于 32 位和 64 位操作系统问题的问题,但我没有。

我有一个名为 ReadFile 的函数,它在标头中声明。我从 main 调用它并将该头文件包含在 main.h 中。我不确定问题是什么。如果 OS X 编译并运行而 Linux 没有,我假设 OS X 在内部做了一些它认为很明显的事情,但 Linux 不是那样写的。这是链接器错误吗?我认为 OS X 将被编程为在内部执行此操作。

4

2 回答 2

1

您在标头中声明您的函数,但没有定义,当您尝试将 main.cpp 转换为可执行文件时会导致未定义的引用。

您需要编译所有源文件并将它们链接在一起(以正确的顺序)。

g++ -c ReadFile.cpp
#...
g++ -c main.cpp
g++ main.o ... ReadFile.o -o my_executable

右侧的目标文件不依赖于命令行左侧目标文件中定义的未解析符号。

于 2012-05-06T14:15:17.830 回答
0

XCode 是一个 IDE,所以我猜它会为您处理链接顺序。

要自动处理所有这些东西,您还必须使用 IDE 和/或编写 Makefile。如果您坚持使用单个命令,是的,您可以,只要您在该行中包含所有源文件(例如 g++ *.cpp),但这会强制对每个更改进行完全重新编译。

于 2012-05-06T21:01:46.420 回答