使用gcc链接库:参数的顺序

Dan*_*age 14 ubuntu gcc libraries

一旦我将Ubuntu发行版升级到11.10,我就开始看到gcc的奇怪链接器行为.我能够通过将我的-l参数移动到gcc命令的末尾来修复问题(我的问题类似于此线程中描述的问题,并且建议的解决方案对我有用......谢谢!).

我的问题是......为什么我现在才有这个问题?我已经在OS X和Ubuntu上开发和测试了这段代码了一段时间:我从来不知道-l命令应该在你的.c文件之后,但即便如此,这从来没有给我带来过问题.我猜它与GCC版本有关,而不是Ubuntu版本.

这个新版本是否比早期版本更严格地执行此要求?

Pat*_*Pat 5

对于 gcc 以及其他编译器(例如 clang),链接器命令参数的顺序确实很重要。根据经验,在编写链接器命令时我将使用以下顺序:

  1. 目标文件 (*.o)
  2. 静态库(*.a)
  3. 共享库(*.so)

共享库的顺序也很重要。如果 libfoo.so 依赖于 libbar.so,则应-lfoo在 之前列出-lbar

如果您不知道确切的依赖关系,这可能会变得非常复杂。Linux 上的以下命令可能会有所帮助:

ldd /path/to/libfoo.so
Run Code Online (Sandbox Code Playgroud)

这列出了 libfoo.so 所依赖的所有共享库。

至于你的问题为什么你的特定 gcc 版本会出现这个问题,在不知道你的应用程序需要哪些库的情况下很难判断。但如果您应用我上面描述的顺序,它应该适用于较旧和较新的 gcc 版本。

提示:如果使用正确,CMake 可以为您处理所有依赖项......

  • 你没有回答问题。 (7认同)