![无法用 libc++ 替换 stdlibc++,链接器阶段错误](https://linux22.com/image/1588389/%E6%97%A0%E6%B3%95%E7%94%A8%20libc%2B%2B%20%E6%9B%BF%E6%8D%A2%20stdlibc%2B%2B%EF%BC%8C%E9%93%BE%E6%8E%A5%E5%99%A8%E9%98%B6%E6%AE%B5%E9%94%99%E8%AF%AF.png)
我目前正在从事我们团队的一个项目,在 CentOS 机器上构建 LLVM 完整的 clang 工具链(Clang、libcxx、libcxxabi)。
以前,我们使用 llvm-toolset-7/clang++ 编译代码库,默认情况下,它使用 libstdc++ 进行编译和链接。现在,我们想切换到使用带有 libc++ 的 LLVM clang。我已经从源代码(5.0.1 版本)构建了 libc++ 和 libc++abi,并设置了相关标志来编译代码库,但结果在“链接器”阶段出现了一些问题:
为编译器设置的标志:
-stdlib=libc++ -std=c++14
为链接器设置的标志:
-stdlib=libc++
错误:
/opt/rh/devtoolset-7/root/usr/lib/gcc/x86_64-redhat-linux/7/../../../../bin/ld: product.o: undefined reference to symbol '__cxa_free_exception@@CXXABI_1.3' //lib64/libstdc++.so.6: error adding symbols: DSO missing from command line clang-5.0: error: linker command failed with exit code 1 (use -v to see invocation)
我的问题是:
我们计划用 libc++ 替换 stdlibc++,并且我们已经设置了编译器和链接器来运行
-stdlib=libc++
。为什么它会抱怨 libstdc++?我们怎样才能解决这个错误?(任何想法都将不胜感激!)
- 如果我们想用 libc++ 替换 stdlibc++,是否缺少了什么?
更多细节:
环境:CentOS Linux 版本 7.6.1810(核心)
Clang 版本:clang 版本 5.0.1(tags/RELEASE_501/final)
目标:x86_64-unknown-linux-gnu
线程模型:posix
我用来构建 LLVM clang、libcxx 和 libcxxabi 的 cmake 命令:
铛:
cmake -DLLVM_ENABLE_PROJECTS="clang;libcxx;libcxxabi" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DLLVM_LIBDIR_SUFFIX=64 ../llvm
libcxx:
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DLLVM_LIBDIR_SUFFIX=64 -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DLIBCXX_CXX_ABI=libcxxabi -DLIBCXX_CXX_ABI_INCLUDE_PATHS=../../libcxxabi/include ..
libcxxabi:
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DLLVM_LIBDIR_SUFFIX=64 -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DLIBCXXABI_LIBCXX_INCLUDES=../../libcxx/include ..