使用clang链接静态库,与顺序无关



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

LLVM 3.2的发行说明指出

llvm ld和llvm存根已被删除,llvm ld功能可以部分替换为llvm link|opt|{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。

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

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

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

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

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

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

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

最新更新