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