从 OS X 迁移到 linux Red-Hat 时出错
Posted
技术标签:
【中文标题】从 OS X 迁移到 linux Red-Hat 时出错【英文标题】:Error when moving from OS X to linux Red-Hat 【发布时间】:2012-05-06 13:36:32 【问题描述】:我使用 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 会在内部进行编程。
【问题讨论】:
如何为 Linux 构建代码? 【参考方案1】:您在标头中声明您的函数,但没有定义,当您尝试将 main.cpp 转换为可执行文件时会导致未定义的引用。
您需要编译所有源文件并将它们链接在一起(以正确的顺序)。
g++ -c ReadFile.cpp
#...
g++ -c main.cpp
g++ main.o ... ReadFile.o -o my_executable
右侧的目标文件不依赖于命令行左侧目标文件中定义的未解析符号。
【讨论】:
是的,有效。以及 ReadFile 函数。我会为其他人做同样的事情。非常感谢。我有几个问题 - 那么 OS X 会为我做这件事吗? Linux没有原因吗?我可以做些什么来修改我的代码,这样我就不必这样做了?我希望能够简单地通过说 - g++ main.cpp 来运行它另外,我声明我的函数但没有定义是什么意思?我以为 xyz.h 有声明,而 xyz.cpp 有定义?这还不够好吗?【参考方案2】:XCode 是一个 IDE,所以我猜它会为您处理链接顺序。
要自动处理所有这些东西,您还必须使用 IDE 和/或编写 Makefile。 如果您坚持使用单个命令,是的,您可以,只要您在该行中包含所有源文件(例如 g++ *.cpp),但这会强制对每个更改进行完全重新编译。
【讨论】:
以上是关于从 OS X 迁移到 linux Red-Hat 时出错的主要内容,如果未能解决你的问题,请参考以下文章
从 Qt 4.x (Ubuntu Linux) 迁移到 Qt 5.1 (Windows 7)
将 Meteor 应用程序从 OS X 部署到 Linux 会导致 bcrypt 问题
新的PGI编译器可将支持GPU的HPC应用从Linux/x86无缝迁移到支持NVLink的OpenPOWER+Tesla
在 Mac OS X 上从 boot2docker 迁移到 Vagrant+NFS 的最快方法是啥?