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