Ubuntu16.04编译OpenPose时遇std::thread链接错误求助
解决OpenPose编译时GLIBCXX版本不匹配的链接错误
问题根源
你碰到的这个链接错误,核心是GLIBCXX版本不兼容:
Anaconda环境里的libopencv_objdetect.so.3.3.1是用更高版本的GCC编译的,它依赖的std::thread相关符号属于GLIBCXX_3.4.22,但你的系统GCC 5.4.0默认提供的libstdc++.so只支持到GLIBCXX_3.4.21(GCC 6.x及以上才引入GLIBCXX_3.4.22),所以链接器找不到对应的符号。
解决方案
下面提供几种从易到难的解决思路,你可以根据自己的需求选择:
方案1:切换到系统自带的OpenCV(推荐)
Anaconda的OpenCV经常会和系统环境产生兼容性问题,优先用系统版本的OpenCV来编译OpenPose:
- 先卸载Anaconda环境里的OpenCV:
conda activate tensorflow_p36 conda remove opencv - 安装Ubuntu官方源的OpenCV 3.3(或者自己编译系统版本的OpenCV):
sudo apt update sudo apt install libopencv-dev libopencv-core-dev libopencv-objdetect-dev - 重新配置OpenPose的CMake,确保它链接到系统的OpenCV:
cd openpose/build rm -rf * cmake -DOpenCV_DIR=/usr/share/OpenCV .. make -j$(nproc)
方案2:升级系统GCC到6.x版本
如果必须用Anaconda的OpenCV,那就把系统GCC升级到支持GLIBCXX_3.4.22的版本:
- 添加Ubuntu工具链的PPA:
sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt update - 安装GCC 6和G++ 6:
sudo apt install gcc-6 g++-6 - 设置GCC 6为默认编译器:
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-6 60 --slave /usr/bin/g++ g++ /usr/bin/g++-6 - 验证GCC版本:
gcc --version,确认显示为6.x - 最后重新编译OpenPose即可
方案3:临时指定Anaconda的libstdc++.so(不推荐)
这是个临时 workaround,可能会引发其他兼容性问题,但可以快速验证是否有效:
- 在编译OpenPose时,修改CMakeLists.txt,添加链接Anaconda的libstdc++:
在OpenPose的主CMakeLists.txt中添加:link_directories(/home/ubuntu/anaconda3/envs/tensorflow_p36/lib) target_link_libraries(openpose.bin stdc++) - 或者在make时直接传递参数:
make -j$(nproc) LDFLAGS="-L/home/ubuntu/anaconda3/envs/tensorflow_p36/lib -lstdc++"
验证步骤
你可以先确认系统和Anaconda环境的GLIBCXX版本:
- 查看系统libstdc++支持的版本:
strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX - 查看Anaconda环境libstdc++支持的版本:
strings /home/ubuntu/anaconda3/envs/tensorflow_p36/lib/libstdc++.so.6 | grep GLIBCXX
对比两者就能明显看到Anaconda的版本更高,这就是问题的关键。
内容的提问来源于stack exchange,提问作者itsxqtar
相关产品推荐
相关产品推荐

