用gcc链接库:参数顺序

用gcc链接库:参数顺序,gcc,ubuntu,libraries,Gcc,Ubuntu,Libraries,当我将Ubuntu发行版升级到11.10版时,我开始看到gcc中奇怪的链接器行为。我可以通过将我的-l参数移动到gcc命令的末尾来解决这个问题(我的问题与中描述的问题类似,建议的解决方案对我有效……谢谢!) 我的问题是…为什么我现在才有这个问题?我在OSX和Ubuntu上开发和测试这段代码已经有一段时间了:我从来不知道-l命令应该跟在你的.c文件后面,但即便如此,这也从来没有给我带来过问题。我猜这与GCC的版本比Ubuntu的发布版本有更多的关系 这个较新的版本是否只是比早期版本更严格地执行此要

当我将Ubuntu发行版升级到11.10版时,我开始看到gcc中奇怪的链接器行为。我可以通过将我的
-l
参数移动到gcc命令的末尾来解决这个问题(我的问题与中描述的问题类似,建议的解决方案对我有效……谢谢!)

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


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

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

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

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

    ldd /path/to/libfoo.so
    
    这将列出libfoo.so所依赖的所有共享LIB

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


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

    您能看到是否回答了您的问题吗?因此:可能重复的可能重复的可能重复的您没有回答问题。