【发布时间】:2011-12-03 13:13:58
【问题描述】:
我对 Linux 编程很陌生。你可以说我是 Windows 人。所以,我将我的项目移植到 Linux 上,这几乎让我发疯:我确定我已经用 -l 标志指定了所有依赖项,但我得到了“未解析的符号”错误。 然后我找到了这个话题,它解决了我的问题:Boost linking on Linux with GCC
谁能解释一下为什么顺序很重要,以及它到底有多重要?我很确定 MSVC 链接器不是这种情况......
【问题讨论】:
我对 Linux 编程很陌生。你可以说我是 Windows 人。所以,我将我的项目移植到 Linux 上,这几乎让我发疯:我确定我已经用 -l 标志指定了所有依赖项,但我得到了“未解析的符号”错误。 然后我找到了这个话题,它解决了我的问题:Boost linking on Linux with GCC
谁能解释一下为什么顺序很重要,以及它到底有多重要?我很确定 MSVC 链接器不是这种情况......
【问题讨论】:
一个简单的例子会让你明白为什么一次性 Unix 链接器关心顺序。
假设您有 main.o(由 main.cpp 生成)和库 libx.a(无依赖关系)和 liby.a(依赖于名为 newRefX 的 libx)。
如果链接器按此顺序进行,则可以,因为链接器从 1 变为 3:
但是如果链接器按这个顺序运行,你会遇到 newRefX 的问题:
因此,您可以看到您希望最底层的库(不依赖其他库的库)最后。
【讨论】:
来自“An Introduction to GCC - for the GNU compilers gcc and g++”
链接器的传统行为是在命令行指定的库中从左到右搜索外部函数。这意味着包含函数定义的库应该出现在任何使用它的源文件或目标文件之后。
我相信 msvc 链接器会对代码进行 2 次传递,因此即使以不同的顺序指定库,它们也可能能够解析符号(缺少引用...)
【讨论】:
这是 Unix 链接器的工作方式,从很久以前...见Levine's book
【讨论】: