WSL中Conan+pybind11/3.0.1与C++23的libstdc++.so链接错误求助
解决WSL Ubuntu24.04下Conan+pybind11+C23的libstdc兼容问题
问题根源是pybind11的Conan包构建/链接时引入了Anaconda环境的libstdc++.so.6,该版本不支持C++23所需的GLIBCXX_3.4.31;移除pybind11后,编译链自动使用系统/usr/lib下的兼容版本。以下是针对性解决方案:
1. 隔离Conan环境,屏蔽Anaconda干扰
Anaconda的环境变量(如LD_LIBRARY_PATH)会让链接器优先搜索其自带库,运行Conan前先清理相关变量:
unset LD_LIBRARY_PATH unset CPATH unset LIBRARY_PATH
之后再执行Conan构建命令(如conan install .、conan build .)。若需要长期隔离,可在启动Conan的脚本中加入上述命令,或在终端配置文件(如.bashrc)中临时注释Anaconda的初始化代码。
2. 强制Conan使用系统标准库
修改Conan配置,强制指定系统的libstdc++和sysroot:
- 编辑默认profile文件(
~/.conan2/profiles/default),添加:[conf] tools.build:compiler.libcxx=libstdc++11 tools.build:sysroot=/usr - 或在项目的
conanfile.py中直接配置:def configure(self): self.conf.define("tools.build:compiler.libcxx", "libstdc++11") self.conf.define("tools.build:sysroot", "/usr")
这会让Conan在编译和链接阶段优先使用系统/usr下的标准库,而非Anaconda提供的版本。
3. 重新构建pybind11包,使用系统编译器
若现有pybind11包是基于Anaconda编译的,需清除后用系统gcc重新构建:
# 移除已安装的pybind11包 conan remove pybind11/3.0.1 -f # 用系统gcc重新安装并构建pybind11 conan install pybind11/3.0.1 --build=pybind11 -s compiler=gcc -s compiler.version=13
Ubuntu24.04默认gcc版本为13,其对应的libstdc++已支持GLIBCXX_3.4.31及以上版本。
4. 在编译阶段强制指定系统库路径
在项目的CMakeLists.txt中添加系统库路径优先级配置:
# 优先链接系统标准库路径 link_directories(/usr/lib/x86_64-linux-gnu) # 强制设置rpath,确保运行时加载系统libstdc++ set(CMAKE_INSTALL_RPATH "/usr/lib/x86_64-linux-gnu") set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
或通过Conan的构建参数直接传递链接选项:
conan build . -c tools.build:linkflags="-L/usr/lib/x86_64-linux-gnu -Wl,-rpath,/usr/lib/x86_64-linux-gnu"
内容的提问来源于stack exchange,提问作者AzusaYu
相关产品推荐
相关产品推荐

