如何强制LLVM的CMake仅使用指定路径的依赖库
问题原因
该报错是因为编译过程中生成的clang-tblgen等工具运行时,动态链接器优先加载了系统/lib64下的旧版libstdc++.so.6,没有用到你自行安装的新版gcc对应的依赖库。你之前设置的CMAKE_LIBRARY_PATH仅作用于编译阶段的库查找,不会影响运行时的动态库搜索逻辑。
解决方案
有两种常用方案可以解决该问题,优先选择第一种:
方案1:CMake配置阶段添加rpath参数(推荐)
在CMake配置命令中添加rpath相关参数,将你自定义的库路径直接写入生成的二进制文件中,编译和后续运行时都会优先从指定路径查找依赖库,无需额外设置环境变量。
需要新增三个参数:
-DCMAKE_CXX_COMPILER=/home/my_user/local/bin/g++:明确指定C编译器为你自行安装的新版g,避免调用系统旧版g++-DCMAKE_EXE_LINKER_FLAGS="-Wl,-rpath=/home/my_user/local/lib64 -Wl,-rpath=/home/my_user/local/lib":给可执行文件添加运行时库搜索路径-DCMAKE_SHARED_LINKER_FLAGS="-Wl,-rpath=/home/my_user/local/lib64 -Wl,-rpath=/home/my_user/local/lib":给共享库添加运行时库搜索路径
完整的CMake配置命令如下:
cmake -S llvm -DCMAKE_BUILD_TYPE=Debug \ -DBUILD_SHARED_LIBS=ON \ -DLLVM_TARGETS_TO_BUILD=all \ -DLLVM_ENABLE_PROJECTS="clang;lld" \ -DCMAKE_INSTALL_PREFIX=/home/my_user/local \ -DCMAKE_C_COMPILER=/home/my_user/local/bin/gcc \ -DCMAKE_CXX_COMPILER=/home/my_user/local/bin/g++ \ -DCMAKE_LIBRARY_PATH=/home/my_user/local/lib \ -DCMAKE_EXE_LINKER_FLAGS="-Wl,-rpath=/home/my_user/local/lib64 -Wl,-rpath=/home/my_user/local/lib" \ -DCMAKE_SHARED_LINKER_FLAGS="-Wl,-rpath=/home/my_user/local/lib64 -Wl,-rpath=/home/my_user/local/lib" \ ../llvm
注意:重新配置前请先清空原有build目录,避免旧缓存导致配置不生效。
方案2:编译时临时设置LD_LIBRARY_PATH
如果不想重新走CMake配置流程,可以在执行make命令时临时指定动态库搜索路径,优先级高于系统默认路径:
LD_LIBRARY_PATH=/home/my_user/local/lib64:/home/my_user/local/lib:$LD_LIBRARY_PATH make -j$(nproc)
该方案仅对当前编译进程生效,后续使用编译好的LLVM工具时,仍需要提前设置LD_LIBRARY_PATH,否则还是会报相同的动态库缺失错误。
内容的提问来源于stack exchange,提问作者MadMax
相关产品推荐
相关产品推荐

