C++ 如何强制clang在默认情况下使用某些库?
我通过以下步骤针对libc++、libc++abi、编译器rt构建了一个接一个的clang:C++ 如何强制clang在默认情况下使用某些库?,c++,build,clang,llvm,clang++,C++,Build,Clang,Llvm,Clang++,我通过以下步骤针对libc++、libc++abi、编译器rt构建了一个接一个的clang: 要下载(并更新)llvm和子项目,我使用以下脚本: svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm cd llvm/tools svn co http://llvm.org/svn/llvm-project/cfe/trunk clang svn co http://llvm.org/svn/llvm-project/clang-tool
- 要下载(并更新)llvm和子项目,我使用以下脚本:
svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm cd llvm/tools svn co http://llvm.org/svn/llvm-project/cfe/trunk clang svn co http://llvm.org/svn/llvm-project/clang-tools-extra/trunk clang/tools/extra svn co http://llvm.org/svn/llvm-project/lldb/trunk lldb svn co http://llvm.org/svn/llvm-project/lld/trunk lld svn co http://llvm.org/svn/llvm-project/polly/trunk polly cd ../projects/ svn co http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt svn co http://llvm.org/svn/llvm-project/libunwind/trunk libunwind svn co http://llvm.org/svn/llvm-project/openmp/trunk openmp svn co http://llvm.org/svn/llvm-project/libcxxabi/trunk libcxxabi svn co http://llvm.org/svn/llvm-project/libcxx/trunk libcxx
- 首先,我使用gcc针对libgcc和libstdc++构建llvm、clang、libunwind,并将它们安装在
中。在以下所有步骤中,除了最后一个步骤外,我都使用这个新的/usr/local
/clang
clang++
- 然后我分别构建了32位和64位版本的libunwind(它们是必不可少的,因为在整个项目树的最终编译过程中,asan需要一些库的32位版本),并相应地将其安装在
和/usr/local/lib
中(我还分别更新了/usr/local/lib32
)LD_LIBRARY_PATH
- 构建32位和64位版本的libcxrt-ABI库,并正确安装它们
- 根据32位和64位版本的libcxx构建libcxx,并正确安装
- 然后针对32位和64位版本的libc++构建libc++abi,并正确安装它们
- 然后根据32位和64位版本的libc++abi构建libc++并在链接到libcxrt的先前版本上正确安装它们
- 毕竟,我根据libc++、libc++abi、libunwind、compiler rt构建了整个项目树,并在
中的旧clang上安装了它/usr/local
CMAKE\u EXE\u linker\u FLAGS
和CMAKE\u SHARED\u linker\u FLAGS
)-lunwind
和-lc++abi
。此外,每次我都使用-stdlib=libc++
和编译器rt(或者,同样地,CLANG\u DEFAULT\u CXX\u STDLIB=libc++
和CLANG\u DEFAULT\u RTLIB=compiler rt
)在我的项目中,我不得不一遍又一遍地做。这很烦人。比如说,Qt创建者生成的项目的CMakeLists.txt
应该手动或通过cmake gui
进行更正
如何使clang
驱动程序在运行时自动将这些选项指定给ld
?是否有类似于RPATH
机制的机制?或者是否有特定的CMake变量(在llvm构建过程之前指定)来实现所需的行为
我可以使用RPATH
来实现我的目的吗
当然,我不想制作一些类似于bash脚本的包装器(类似于
clang++-libc++
)来指定其他参数。我希望库在clang
二进制文件本身的某个地方进行硬编码。已经提出了一些解决方法。我最终得到了以下解决方法:
mkdir build
cd build
# backup:
cp -vaf /usr/local/lib/libc++.{a,so.1.0} /usr/local/lib/libc++abi.{a,so.1.0} /usr/local/lib/libunwind.{a,so.1.0} .
clang -shared -fPIC -pthread -o fuse.so -Wl,--whole-archive libc++.a libc++abi.a libunwind.a -Wl,--no-whole-archive -ldl -lm
ar x libc++.a
ar x libc++abi.a
ar x libunwind.a
ar rc fuse.a *.o
sudo chown root:root fuse.*
sudo cp -vaf fuse.so /usr/local/lib/
sudo ln -svf /usr/local/lib/libc++.so.1 /usr/local/lib/fuse.so
sudo cp -vaf fuse.a /usr/local/lib/
sudo mv -vf /usr/local/lib/libc++.a /usr/local/lib/libc++.a.bak
sudo ln -svf /usr/local/lib/libc++.a /usr/local/lib/fuse.a
它将使用的所有库(libc++
、libc++abi
和libunwind
)合并到一个*.a
或*.so
文件中。然后libc++.a
和libc++。因此
将替换为(指向)生成的组合文件,保存以前的版本以备备份
它对我非常有效
但这不是答案。也许有一天,
clang
从盒子里就不会有这样的问题。如果你在Linux上,只需输入类似于INPUT的东西(libc++.so.1-lc++abi-lunwind)
进入您的libc++。因此
@SK logic这是一个很好的解决方法。很可能我必须使用它,但除此之外,我想通过配置llvm构建找到一种方法。我不认为有什么神奇的变量可以做到这一点(至少不是快速浏览就能找到的),但这当然可以通过修补lib/Driver/Tools.cpp来实现,各种标准库都是硬编码的。现在我想我可以将libc++.a
、libc++abi.a
和libunwind.a
合并到一个libc++.a
文件中。但是如何处理*。所以?如果在Linux上使用,请输入(libc++.so.1-lc++abi-lunwind)输入到您的libc++。