当我将Ubuntu发行版升级到11.10时,我开始看到gcc的奇怪链接器行为。我能够通过将-l
参数移动到gcc命令的末尾来解决问题(我的问题类似于this thread中描述的问题,并且建议的解决方案对我有用...谢谢!)。
我的问题是......为什么我现在才有这个问题?我已经在OS X和Ubuntu上开发和测试这段代码了一段时间:我从来不知道{.1}}命令应该在你的.c文件之后,但即便如此,这从未给我带来过问题。我猜它与GCC版本有关,而不是Ubuntu版本。
这个较新的版本是否比早期版本更严格地执行此要求?
答案 0 :(得分:1)
使用gcc以及其他编译器(例如clang),链接器命令参数的顺序很重要。 根据经验,我在编写链接器命令时会使用以下顺序:
共享库的顺序也很重要。如果libfoo.so依赖于libbar.so,则应在-lfoo
之前列出-lbar
。
如果您不知道确切的依赖关系,这会变得非常复杂。 linux上的以下命令可以提供帮助:
ldd /path/to/libfoo.so
列出了libfoo.so所依赖的所有共享库。
至于你的问题为什么这个问题突然出现在你的特定gcc版本中,很难说不知道你的应用程序需要哪些库。但是如果您按照我上面描述的那样应用订单,它应该适用于较旧和较新的gcc版本。
提示:如果使用正确,CMake可以为您处理所有依赖项内容......