6

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

4

3 回答 3

4

LLVM 3.2的发行说明指出

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。

于 2014-10-14T13:26:44.240 回答
3

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

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

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

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

于 2014-10-13T19:52:23.647 回答
0

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

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

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

于 2015-05-18T14:03:48.507 回答