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。我一直无法找到解决方案,以下是我尝试过的方法

  1. 我找到了所有 TBB 库并手动将它们添加到 CMakelists.txt 中的 target_link_libraries()。它们是:
/usr/local/lib/libtbb.12.dylib
/usr/local/lib/libtbb.dylib
/usr/local/lib/libtbb.12.3.dylib
  1. 尝试使用 find_package(TBB) 或 find_package(tbb::TBB) 添加它们,然后分别将 ${TBB_INCLUDE_Dirs} 和 ${TBB_LIBRARIES} 用于 target_include_directories() 和 target_link_libraries()。如果 ${TBB_FOUND} 返回 true 但当我尝试在控制台上使用 message() 命令打印出所有 TBB 包含的目录和库时,我什么也没得到。

  2. 尝试从项目中删除 OpenCASCADE,以防与其 TBB 依赖项发生冲突,但即便如此也没有任何效果

任何指点、建议都会非常有帮助。如果需要更多信息,请告诉我。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...