将静态库与clang链接,不依赖于顺序

时间:2014-09-23 03:05:07

标签: c++ clang static-linking lld

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

3 个答案:

答案 0 :(得分:4)

LLVM 3.2的release notes说明了

  

llvm-ld和llvm-stub已被删除,llvm-ld功能可以部分替换为llvm-link |选择| {llc | as,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。

答案 1 :(得分:3)

我不是循环依赖的粉丝:)但 here 有人说他们通过两次连接一些库来处理这种情况。我没有尝试过,但这可能会增加你的代码的足迹。

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

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

最佳解决方案是删除循环依赖项,因为它将在未来产生更多问题。

答案 2 :(得分:0)

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

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

据我所知,gcc和g ++也是如此。