如何解决MacOS 上的 C++ 编译错误:在 /usr/local/include/tbb/parallel_reduce.herror::17 中包含的文件中:对“split”的引用不明确
我正在 MacOS Big Sur 上创建一个 C++ 项目(我们称之为项目“X”),并使用 Clion 作为 IDE 和 CMake 来配置包。该项目依赖于 OpenVDB、OpenCASCADE 和 Boost。当我尝试构建项目时,我面临与 OpenVDB 的依赖项之一相关的错误 - TBB。构建失败并在代码中的多个位置抛出错误(OpenVDB 遇到此 TBB 依赖项的任何位置): 在 /usr/local/include/tbb/parallel_reduce.herror::17 包含的文件中: 对“拆分”的引用不明确
- 背景信息:
我使用 brew 公式安装了 OpenVDB,它的版本是 8.1.0。 CMake 无法使用 find_package(OpenVDB) 定位 OpenVDB 进行 brew 安装(github 上的开放问题:https://github.com/AcademySoftwareFoundation/openvdb/issues/412)所以我在全局 CMakeLists.txt 中手动添加了所有 OpenVDB 库。项目中只有 1 个 CMakeLists.txt。
target_include_directories(${executable}
PUBLIC
./
${OpenCASCADE_INCLUDE_DIR}
${Boost_INCLUDE_Dirs}
/usr/local/include/openvdb
/usr/local/include/tbb
)
target_link_libraries(${executable}
PUBLIC
${OpenCASCADE_LIBRARIES}
Boost::system
Boost::filesystem
# OpenVDB libraries begin:-
/usr/local/lib/libopenvdb.8.1.0.dylib
/usr/local/lib/libopenvdb.8.1.dylib
/usr/local/lib/libopenvdb.a
/usr/local/lib/libopenvdb.dylib
)
项目中的类和包含的头文件链接良好 - CMake 可以定位所有包,类和头文件能够找到并识别所有依赖的内部和外部类。但是一旦我开始构建项目,我就会收到这个错误:
In file included from /usr/local/include/openvdb/openvdb.h:12:
In file included from /usr/local/include/openvdb/Grid.h:12:
In file included from /usr/local/include/openvdb/tree/Tree.h:13:
In file included from /usr/local/include/openvdb/tools/Count.h:/usr/local/include/tbb/../oneapi/tbb/parallel_reduce.h15::
379In file included from :57/usr/local/include/openvdb/tree/NodeManager.h:: 18:
In file included from /usr/local/include/tbb/parallel_reduce.herror:: 17:
reference to 'split' is ambiguous
**/usr/local/include/tbb/../oneapi/tbb/parallel_reduce.h:379:57: error: reference to 'split' is ambiguous**
lambda_reduce_body( lambda_reduce_body& other,tbb::split )
^ lambda_reduce_body( lambda_reduce_body& other,tbb::split )
^
/usr/local/include/openvdb/math/Coord.h:16:23: note: candidate found by name lookup is 'tbb::split'
/usr/local/include/openvdb/math/Coord.h:16:23: note: candidate found by name lookup is 'tbb::split'
namespace tbb { class split; } // forward declaration
^
namespace tbb { class split; } // forward declaration
/usr/local/include/tbb/../oneapi/tbb/parallel_for.h: ^465
:15: note/usr/local/include/tbb/../oneapi/tbb/parallel_for.h: :465candidate found by name lookup is 'tbb::v1::split':15
: note: candidate found by name lookup is 'tbb::v1::split'
using detail::split;using detail::split;
我在多个地方遇到同样的错误,只要有 OpenVDB 依赖于 tbb::split。我一直无法找到解决方案,以下是我尝试过的方法:
- 我找到了所有 TBB 库并手动将它们添加到 CMakelists.txt 中的 target_link_libraries()。它们是:
/usr/local/lib/libtbb.12.dylib
/usr/local/lib/libtbb.dylib
/usr/local/lib/libtbb.12.3.dylib
-
尝试使用 find_package(TBB) 或 find_package(tbb::TBB) 添加它们,然后分别将 ${TBB_INCLUDE_Dirs} 和 ${TBB_LIBRARIES} 用于 target_include_directories() 和 target_link_libraries()。如果 ${TBB_FOUND} 返回 true 但当我尝试在控制台上使用 message() 命令打印出所有 TBB 包含的目录和库时,我什么也没得到。
任何指点、建议都会非常有帮助。如果需要更多信息,请告诉我。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。