Ubuntu20.04下C++17并行算法结合CMake链接TBB报错如何解决?
问题根因
Ubuntu 20.04官方源提供的libtbb-dev版本为2020.1,属于传统TBB版本,而非重构后的oneTBB,存在两个核心冲突:
- 旧版TBB的CMake配置不提供
TBB::tbb导入目标,该目标是oneTBB 2021及以上版本才支持的特性,这是你修改配置后报目标找不到的直接原因 - 系统预编译的TBB库使用的C++ ABI和gcc 11默认启用的ABI不兼容,导致链接时符号不匹配,就是你最开始遇到的未定义符号错误
解决方案
方案一:适配系统自带旧版TBB(无需额外安装组件)
- 还原CMake配置,删除
TBB::tbb相关写法,恢复使用旧版TBB的标准配置:
find_package(TBB REQUIRED) # 替代原来的${TBB_IMPORTED_TARGETS}写法 target_include_directories(SigContrastFastAviUtl_test PRIVATE ${TBB_INCLUDE_DIRS}) target_link_libraries(SigContrastFastAviUtl_test ${TBB_LIBRARIES} Threads::Threads)
- 配置CMake时添加ABI兼容参数,对齐系统TBB的编译配置:
rm -rf build # 先清理之前的缓存 cmake -B build -DCMAKE_CXX_COMPILER=g++-11 -DCMAKE_C_COMPILER=gcc-11 -DCMAKE_CXX_FLAGS="-D_GLIBCXX_USE_CXX11_ABI=0"
如果还是报符号错误,把_GLIBCXX_USE_CXX11_ABI的值改为1重试即可。
方案二:升级到oneTBB(长期兼容性更好)
如果你希望使用TBB::tbb的现代CMake写法,可以卸载系统旧版TBB后安装oneTBB:
- 卸载系统自带TBB:
sudo apt remove -y libtbb-dev libtbb2
- 下载oneTBB预编译包解压安装到
/usr/local目录,或添加第三方源安装oneTBB 2021+版本 - 此时你修改后的使用
TBB::tbb的CMake配置即可正常运行,无需额外处理ABI兼容问题
内容的提问来源于stack exchange,提问作者yumetodo
相关产品推荐
相关产品推荐

