CMake如何正确配置运行时库路径解决libstdc++版本报错
问题根因
link_directories() 命令仅对编译链接阶段生效,作用是告诉链接器在对应路径下查找依赖库,因此项目可以正常编译出可执行文件。但该命令不会将自定义库路径写入可执行文件的运行时搜索路径(RPATH/RUNPATH),程序启动时系统动态链接器会优先加载系统默认/usr/lib64、/lib64路径下的旧版libstdc++.so.6,旧版库不包含GCC 12.1引入的GLIBCXX_3.4.29符号,因此抛出版本不匹配错误。
CMake 正确配置方案
方案1:全局配置(推荐,适配自定义编译器场景)
在CMakeLists.txt最顶部(确保在创建构建目标前生效)添加如下配置,会自动将自定义GCC库路径写入所有构建目标的运行时搜索路径:
# 配置本地构建生成的可执行文件的运行时库搜索路径 set(CMAKE_BUILD_RPATH "/home/myCompilers/gcc1210/lib64") # 配置make install后安装的可执行文件的运行时库搜索路径 set(CMAKE_INSTALL_RPATH "/home/myCompilers/gcc1210/lib64") # 禁止构建阶段自动剔除RPATH信息 set(CMAKE_SKIP_BUILD_RPATH FALSE) # 构建阶段使用独立的构建RPATH,不提前占用安装RPATH配置 set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) # 自动将链接时用到的非系统库路径追加到RPATH,避免遗漏其他自定义依赖 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
方案2:单目标定向配置
如果不需要全局生效,仅需要对指定可执行文件配置,可以针对目标单独添加链接参数,直接把rpath写入可执行文件:
# 替换project_exe为实际的可执行文件目标名 target_link_options(project_exe PRIVATE "-Wl,-rpath,/home/myCompilers/gcc1210/lib64" )
配置有效性验证
重新全量编译项目后,在可执行文件目录执行如下命令检查依赖加载路径:
ldd ./project_exe | grep libstdc++.so.6
如果输出指向/home/myCompilers/gcc1210/lib64/libstdc++.so.6,说明配置正确,程序可正常启动。也可以执行readelf -d ./project_exe | grep -E 'RPATH|RUNPATH'确认自定义路径已经写入可执行文件。
临时运行方案(无需修改CMake)
如果只是临时调试不想改配置,可以在运行程序前临时指定动态库搜索路径:
export LD_LIBRARY_PATH=/home/myCompilers/gcc1210/lib64:$LD_LIBRARY_PATH ./project_exe
注意:
link_directories()是CMake早期版本的遗留命令,官方目前推荐优先使用target级别的依赖配置,不建议依赖该命令处理库路径问题。
内容的提问来源于stack exchange,提问作者virus00x
相关产品推荐
相关产品推荐

