Windows下使用MinGW+CMake编译TBB出现unknown-pragmas错误求助
报错根本原因
oneTBB默认开启了「将所有警告视为错误」的编译规则,而#pragma intrinsic是MSVC编译器专用的编译指令,MinGW的GCC无法识别该指令,触发了未知pragma警告,进而被判定为编译错误。
之前使用预编译二进制出现未定义引用问题,是因为公开的预编译oneTBB包大多是MSVC编译器构建的,和MinGW的ABI不兼容,无法直接链接使用,自行用MinGW编译的思路是正确的。
解决方案
按以下步骤操作即可完成编译:
- 第一步:生成MinGW构建文件时添加额外参数,关闭TBB的Werror规则并忽略未知pragma警告,执行命令:
cmake .. -G "MinGW Makefiles" -DTBB_ENABLE_WERROR=OFF -DCMAKE_CXX_FLAGS="-Wno-unknown-pragmas"
如果需要自定义安装路径,可以额外添加参数-DCMAKE_INSTALL_PREFIX=自定义安装路径。 - 第二步:执行编译命令
任选cmake --build .或者mingw32-make其一执行即可,编译速度取决于设备性能。 - 第三步:安装并配置环境
编译完成后执行mingw32-make install将头文件、库文件安装到指定目录。后续编译你的项目时,cmake命令添加-DTBB_ROOT=你的TBB安装路径即可让find_package正确找到你编译的TBB版本,同时建议将TBB安装路径下的bin目录加入系统环境变量PATH,避免运行时找不到动态库。
备选修复方案
如果添加上述cmake参数后仍然报错,可以直接修改oneTBB源码中的头文件:
找到include/oneapi/tbb/detail/_machine.h的第67行,将原有的#pragma intrinsic(_mm_mfence)用MSVC专用宏包裹,修改后内容如下:
#ifdef _MSC_VER #pragma intrinsic(_mm_mfence) #endif
修改完成后重新执行编译命令即可。
内容的提问来源于stack exchange,提问作者Kyllian Lissens
相关产品推荐
相关产品推荐

