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

时间:2011-10-19 18:46:33

标签: gcc ubuntu libraries

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

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

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

1 个答案:

答案 0 :(得分:1)

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

  1. 目标文件(* .o)
  2. 静态库(* .a)
  3. 共享库(* .so)
  4. 共享库的顺序也很重要。如果libfoo.so依赖于libbar.so,则应在-lfoo之前列出-lbar

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

    ldd /path/to/libfoo.so
    

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

    至于你的问题为什么这个问题突然出现在你的特定gcc版本中,很难说不知道你的应用程序需要哪些库。但是如果您按照我上面描述的那样应用订单,它应该适用于较旧和较新的gcc版本。

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