Ori*_*ent 20 c++ build llvm clang clang++
我建立铛由铛反对的libc ++,的libc ++ ABI,编译器RT在下面的步骤:
要下载(和更新)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
Run Code Online (Sandbox Code Playgroud)首先,我使用gcc对libgcc和libstdc ++构建llvm,clang,libunwind并安装它们.在除了最后一个步骤之外的所有以下步骤中,我使用这个新鲜/ ./usr/localclangclang++
/usr/local/lib和/usr/local/lib32相应地(也LD_LIBRARY_PATH分别更新)./usr/local.(我几乎可以肯定这里没有任何步骤.)
在最后一步我有一个问题:我必须向链接器添加额外的参数(我将它们添加到CMAKE_EXE_LINKER_FLAGS和CMAKE_SHARED_LINKER_FLAGS)-lunwind和-lc++abi.而且,每次我在我的项目中使用结果clang++with -stdlib=libc++和compiler-rt(或者同样地,CLANG_DEFAULT_CXX_STDLIB=libc++和CLANG_DEFAULT_RTLIB=compiler-rt)时,我必须一遍又一遍地使用它.这很烦人.说Qt Creator生成的项目CMakeLists.txt应该手动或通过cmake-gui.
如何让clang驱动程序ld在运行时自动指定这些选项?是否有类似于RPATH机制的东西?或者是否有一些特定的CMake变量(在llvm构建过程之前指定)来实现所需的行为?
我可以RPATH用于我的目的吗?
当然我不想做一些庆典 -script像包装(类似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
Run Code Online (Sandbox Code Playgroud)
它将所有使用的库(libc++、libc++abi和libunwind)合并到一个单个*.a或*.so文件中。然后libc++.a和libc++.so被替换为(链接到)生成的组装文件,保存以前的版本以供可能的备份。
它非常适合我。
但这不是答案。也许有一天,clang从盒子里拿出来就不会出现这样的问题了。