从OS X迁移到Linux Red-Hat时出错

时间:2012-05-06 13:36:33

标签: c++ linux xcode macos

我用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中包含该头文件。我不确定问题是什么。如果OS X编译并运行而Linux没有,我假设OS X内部有一些它认为很明显但是Linux不是那样写的。这是链接器错误吗?我认为OS X将被编程为内部执行此操作。

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

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

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