【问题标题】:Linking static libraries with clang independent of order使用与顺序无关的clang链接静态库
【发布时间】:2014-11-17 03:14:54
【问题描述】:

在 GCC 中,我可以使用链接器标志 -Wl,--start-group-Wl,--end-group 来解决与具有循环依赖关系的库的链接问题。我想对 clang 做同样的事情,但这个功能似乎是 dropped in lld version 3.2。我该怎么做?

【问题讨论】:

  • 列出所有库(以任何顺序)两次:-la -lb ...-lx -la -lb ... -lx(最好使用脚本完成)
  • @mlvljr 这可能还不够。
  • @user1225999 应该是——这保证对于目标代码中引用的每个符号,~定义在引用/声明之后至少出现一次
  • @mlvljr GNU ld 将只包含它当时实际需要的存档中的对象。知道这一点就可以轻松构建反例:pastebin.com/YSrNqT4h

标签: c++ clang static-linking lld


【解决方案1】:

我不喜欢循环依赖 :) 但是 here 有人说他们通过链接某些库两次来处理这种情况。我还没有尝试过,但这可能会增加您的代码占用空间。

$(CC) -o myApp -lfoo -lbar -lfoo

我不知道这是否适用于 clang,但它可能值得一试。

最好的解决方案是移除循环依赖,因为它会在未来给您带来更多问题。

【讨论】:

    【解决方案2】:

    我在使用 QT c++ 项目与自定义 clang 编译器链接时遇到了类似问题。

    问题原来是 QT 使用的是 clang(c 编译器)而不是 clang++(c++ 编译器)。通过在 QT 项目中将编译器定义为 clang++ 而不是 clang(设置 QMAKE_CXX=clang++),项目链接成功。

    据我了解,gcc 和 g++ 也是如此。

    【讨论】:

      【解决方案3】:

      LLVM 3.2 的 release notes 声明

      llvm-ld 和 llvm-stub 已被移除,llvm-ld 功能可以部分替换为 llvm-link |选择 | {llc |如,llc -filetype=obj} | ld,或完全被 Clang 替换。

      默认情况下,clang 似乎使用系统链接器。例如在 Linux 上它使用 GNU ld:

      $ clang --version
      clang version 3.2 (branches/release_32 170558)
      ...
      $ clang -Wl,--verbose
      GNU ld (GNU Binutils; devel:gcc / openSUSE_12.3) 2.24.0.20140403-196
      ...
      

      这表明您可以像使用 GCC 一样使用 -Wl,--start-group 和 -Wl,--end-group。

      【讨论】:

      • 就是这样。 Apple 的 ld 工具不支持 --start-group 标志,但它也不关心循环依赖。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      相关资源
      最近更新 更多