c++ - 如何强制 clang 默认使用某些库?

我通过 clang 针对 libc++libc++abicompiler-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-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
    
  • 首先我针对 libgcc 构建 llvmclanglibunwind libstdc++ 使用 gcc 并将它们安装在 /usr/local 中。在除了最后一个之外的所有步骤中,我使用这个新的 clang/clang++

  • 然后我分别构建 libunwind,32 位和 64 位版本(它们是必不可少的,因为 asan 需要 32 位在整个项目树的最终编译期间的某些库的版本)并将其安装在 /usr/local/lib/usr/local/lib32 相应(我也更新LD_LIBRARY_PATH)。
  • 构建 libcxxrt ABI 库 32 位和 64 位版本并正确安装。
  • 针对 libcxxrt 32 位和 64 位版本构建 libcxx 并正确安装它们。
  • 然后针对 libc++ 32 位和 64 位版本构建 libc++abi 并正确安装它们。
  • 然后针对 libc++abi 32 位和 64 位版本构建 libc++,并在链接到 libcxxrt的先前版本上正确安装它们em>。
  • 毕竟我针对libc++libc++abilibunwindcompiler-rt构建了整个项目树em> 并将其安装在 /usr/local 中的旧 clang 上。

(我几乎可以肯定这里没有多余的步骤。)

在最后一步我有一个问题:我必须向链接器添加额外的参数(我将它们添加到 CMAKE_EXE_LINKER_FLAGSCMAKE_SHARED_LINKER_FLAGS)-lunwind-lc++abi。此外,每次我将生成的 clang++-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 用于我的目的吗?

我当然不想制作一些 bash-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

它将所有使用的库(libc++libc++abilibunwind)合并到一个单一的 *.a *.so 文件。然后 libc++.alibc++.so 被替换为(链接到)生成的汇编文件,保存以前的版本以备可能。

它非常适合我。

但这不是答案。也许有一天 clang 不会有这样的问题。

https://stackoverflow.com/questions/39716684/

相关文章:

visual-studio - Visual Studio 可以在构建日志中添加时间戳吗?

ios - 防止 Xcode 每次都构建子项目

haskell - 平行 cabal

build - Unix : fast 'remove directory' for cleanin

java - 无法找到 tools.jar。预计在 C :\Program Files\Java\j

c - 去 1.5+ : Error - imports runtime: C source fil

java - 如何解决模块 X 的多个工件被检索到 Apache Ivy 中的同一个文件?

ios - asm中的未知寄存器名称 'q0'

ios - 从 xcode 命令行生成 ipa

build - 更改 CMake 文件标准位置