【问题标题】:Linking libraries with gcc: order of arguments用 gcc 链接库:参数的顺序
【发布时间】:2011-12-11 04:54:53
【问题描述】:

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

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

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

【问题讨论】:

标签: gcc ubuntu libraries


【解决方案1】:

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

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

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

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

ldd /path/to/libfoo.so

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

关于您的问题,为什么您的特定 gcc 版本会出现此问题,如果不知道您的应用程序需要哪些库,就很难说清楚。但是,如果您像我上面描述的那样应用顺序,它应该适用于较旧和较新的 gcc 版本。

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

【讨论】:

  • 你没有回答问题。
【解决方案2】:

我怀疑你的问题是因为 Ubuntu v11.10 的 GCC v4.6 默认启用了-Wl,--as-needed,这使得链接器对命令行中库的顺序很敏感。

  • Ubuntu v11.10 包含 GCC v4.6 作为默认编译器 [1]。

  • Ubuntu v11.10 的 GCC 默认启用 -Wl,--as-needed [2]。

  • “--as-needed 选项还使链接器对命令行中库的顺序敏感。您可能需要稍后在命令行中移动一些库,因此它们位于其他库或文件之后需要他们的符号。” [3]

[1]https://wiki.ubuntu.com/OneiricOcelot/ReleaseNotes#GCC_4.6_Toolchain

[2]https://wiki.ubuntu.com/ToolChain/CompilerFlags#A-Wl.2C--as-needed

[3]https://wiki.ubuntu.com/NattyNarwhal/ToolchainTransition

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 2011-02-07
    • 2021-11-06
    相关资源
    最近更新 更多