使用gRPC与OpenCV编译C++代码时遇GLIBCXX版本依赖链接错误求助
解决gRPC+OpenCV CMake构建时的GLIBCXX版本链接错误
问题详情
- 项目环境:C++项目,集成gRPC与OpenCV,通过CMake+Make构建,已手动指定所需库及.so文件路径
- 构建命令:
cmake -DCMAKE_PREFIX_PATH=$MY_INSTALL_DIR ../.. make -j 4
- 触发的链接错误:
/usr/bin/ld: /usr/local/lib/libopencv_core.so: undefined reference to `std::condition_variable::wait(std::unique_lock<std::mutex>&)@GLIBCXX_3.4.30'
- 附加现象:仅使用OpenCV的代码直接用g++编译可正常运行,但代码中包含
cv::Mat时就会触发上述错误;已尝试在CMakeLists.txt中添加各类依赖库、配置环境变量路径,问题仍未解决。
解决方案
1. 检查GCC与GLIBCXX版本兼容性
std::condition_variable::wait的GLIBCXX_3.4.30符号是GCC 10.x及以上版本才提供的,错误本质是当前构建环境使用的libstdc++.so版本不包含该符号:
- 检查当前g++版本:
若版本低于10,需升级GCC到10或更高版本。g++ --version - 验证系统libstdc++.so是否包含目标版本符号:
若无输出,说明需要更新libstdc++库(可通过升级GCC同步更新)。strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX_3.4.30
2. 强制CMake使用指定GCC版本
若系统存在多版本GCC,CMake可能默认选用了旧版本,需手动指定:
- 在CMakeLists.txt开头添加:
(路径根据实际安装的GCC版本调整)set(CMAKE_C_COMPILER /usr/bin/gcc-10) set(CMAKE_CXX_COMPILER /usr/bin/g++-10) - 或在cmake命令行直接指定:
cmake -DCMAKE_C_COMPILER=gcc-10 -DCMAKE_CXX_COMPILER=g++-10 -DCMAKE_PREFIX_PATH=$MY_INSTALL_DIR ../..
3. 对齐OpenCV与项目的编译环境
你的OpenCV可能是用高版本GCC编译的,但当前项目构建用的是低版本GCC,导致链接时依赖版本不兼容:
- 重新使用当前项目指定的GCC版本编译OpenCV,确保两者依赖的libstdc++版本一致。
4. 显式指定libstdc++链接路径
若系统已安装高版本libstdc++但未被优先加载,可在构建时指定路径:
- 在CMakeLists.txt中添加:
(路径根据实际GCC版本的库路径调整)link_directories(/usr/lib/gcc/x86_64-linux-gnu/10) - 或在make时临时指定环境变量:
LD_LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/10 make -j4
内容的提问来源于stack exchange,提问作者hanover
相关产品推荐
相关产品推荐

