Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何强制clang在默认情况下使用某些库?_C++_Build_Clang_Llvm_Clang++ - Fatal编程技术网

C++ 如何强制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

我通过以下步骤针对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-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构建了整个项目树,并在
    /usr/local
    中的旧clang上安装了它
(我几乎可以肯定,这里没有多余的步骤。)

在最后一步,我遇到了一个问题:我必须向链接器添加额外的参数(我将它们添加到
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++。