在 macOS 上编译 papillo 包时 tbb 库出现问题

having problems with the tbb library while compiling the papillo package on macOS

我正在尝试通过 Scip 优化套件安装 scip。我用 Cmake 构建 scip,Cmake 部分工作得很好。执行make命令时出现如下错误

Undefined symbols for architecture x86_64:
  "tbb::interface5::internal::task_base::destroy(tbb::task&)", referenced from:
      void tbb::parallel_invoke<papilo::ConstraintMatrix<double>::compress(bool)::'lambda'(), papilo::ConstraintMatrix<double>::compress(bool)::'lambda0'()>(double const&, papilo::ConstraintMatrix<double>::compress(bool)::'lambda'() const&, tbb::task_group_context&) in libpapilo-core.a(ConstraintMatrix.cpp.o)
      void tbb::parallel_invoke<papilo::ConstraintMatrix<double>::compress(bool)::'lambda1'(), papilo::ConstraintMatrix<double>::compress(bool)::'lambda2'(), papilo::ConstraintMatrix<double>::compress(bool)::'lambda3'(), papilo::ConstraintMatrix<double>::compress(bool)::'lambda4'(), papilo::ConstraintMatrix<double>::compress(bool)::'lambda5'()>(double const&, papilo::ConstraintMatrix<double>::compress(bool)::'lambda1'() const&, papilo::ConstraintMatrix<double>::compress(bool)::'lambda2'() const&, papilo::ConstraintMatrix<double>::compress(bool)::'lambda3'() const&, papilo::ConstraintMatrix<double>::compress(bool)::'lambda4'() const&, tbb::task_group_context&) in libpapilo-core.a(ConstraintMatrix.cpp.o)
      void tbb::parallel_invoke<papilo::ConstraintMatrix<double>::deleteRowsAndCols(std::__1::vector<int, std::__1::allocator<int> >&, std::__1::vector<int, std::__1::allocator<int> >&, std::__1::vector<papilo::RowActivity<double>, std::__1::allocator<papilo::RowActivity<double> > >&, std::__1::vector<int, std::__1::allocator<int> >&, std::__1::vector<int, std::__1::allocator<int> >&, std::__1::vector<int, std::__1::allocator<int> >&)::'lambda'(), papilo::ConstraintMatrix<double>::deleteRowsAndCols(std::__1::vector<int, std::__1::allocator<int> >&, std::__1::vector<int, std::__1::allocator<int> >&, std::__1::vector<papilo::RowActivity<double>, std::__1::allocator<papilo::RowActivity<double> > >&, std::__1::vector<int, std::__1::allocator<int> >&, std::__1::vector<int, std::__1::allocator<int> >&, std::__1::vector<int, std::__1::allocator<int> >&)::'lambda0'()>(double const&, papilo::ConstraintMatrix<double>::deleteRowsAndCols(std::__1::vector<int, std::__1::allocator<int> >&, std::__1::vector<int, std::__1::allocator<int> >&, std::__1::vector<papilo::RowActivity<double>, std::__1::allocator<papilo::RowActivity<double> > >&, std::__1::vector<int, std::__1::allocator<int> >&, std::__1::vector<int, std::__1::allocator<int> >&, std::__1::vector<int, std::__1::allocator<int> >&)::'lambda'() const&, tbb::task_group_context&) in libpapilo-core.a(ConstraintMatrix.cpp.o)
      void tbb::parallel_invoke<papilo::ConstraintMatrix<double>::deleteRowsAndCols(std::__1::vector<int, std::__1::allocator<int> >&, std::__1::vector<int, std::__1::allocator<int> >&, std::__1::vector<papilo::RowActivity<double>, std::__1::allocator<papilo::RowActivity<double> > >&, std::__1::vector<int, std::__1::allocator<int> >&, std::__1::vector<int, std::__1::allocator<int> >&, std::__1::vector<int, std::__1::allocator<int> >&)::'lambda1'(), papilo::ConstraintMatrix<double>::deleteRowsAndCols(std::__1::vector<int, std::__1::allocator<int> >&, std::__1::vector<int, std::__1::allocator<int> >&, std::__1::vector<papilo::RowActivity<double>, std::__1::allocator<papilo::RowActivity<double> > >&, std::__1::vector<int, std::__1::allocator<int> >&, std::__1::vector<int, std::__1::allocator<int> >&, std::__1::vector<int, std::__1::allocator<int> >&)::'lambda2'()>(double const&, papilo::ConstraintMatrix<double>::deleteRowsAndCols(std::__1::vector<int, std::__1::allocator<int> >&, std::__1::vector<int, std::__1::allocator<int> >&, std::__1::vector<papilo::RowActivity<double>, std::__1::allocator<papilo::RowActivity<double> > >&, std::__1::vector<int, std::__1::allocator<int> >&, std::__1::vector<int, std::__1::allocator<int> >&, std::__1::vector<int, std::__1::allocator<int> >&)::'lambda1'() const&, tbb::task_group_context&) in libpapilo-core.a(ConstraintMatrix.cpp.o)
      void tbb::parallel_invoke<papilo::ConstraintMatrix<double>::deleteRowsAndCols(std::__1::vector<int, std::__1::allocator<int> >&, std::__1::vector<int, std::__1::allocator<int> >&, std::__1::vector<papilo::RowActivity<double>, std::__1::allocator<papilo::RowActivity<double> > >&, std::__1::vector<int, std::__1::allocator<int> >&, std::__1::vector<int, std::__1::allocator<int> >&, std::__1::vector<int, std::__1::allocator<int> >&)::'lambda3'(), papilo::ConstraintMatrix<double>::deleteRowsAndCols(std::__1::vector<int, std::__1::allocator<int> >&, std::__1::vector<int, std::__1::allocator<int> >&, std::__1::vector<papilo::RowActivity<double>, std::__1::allocator<papilo::RowActivity<double> > >&, std::__1::vector<int, std::__1::allocator<int> >&, std::__1::vector<int, std::__1::allocator<int> >&, std::__1::vector<int, std::__1::allocator<int> >&)::'lambda4'()>(double const&, papilo::ConstraintMatrix<double>::deleteRowsAndCols(std::__1::vector<int, std::__1::allocator<int> >&, std::__1::vector<int, std::__1::allocator<int> >&, std::__1::vector<papilo::RowActivity<double>, std::__1::allocator<papilo::RowActivity<double> > >&, std::__1::vector<int, std::__1::allocator<int> >&, std::__1::vector<int, std::__1::allocator<int> >&, std::__1::vector<int, std::__1::allocator<int> >&)::'lambda3'() const&, tbb::task_group_context&) in libpapilo-core.a(ConstraintMatrix.cpp.o)
      void tbb::parallel_invoke<papilo::ConstraintMatrix<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1> >::compress(bool)::'lambda'(), papilo::ConstraintMatrix<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1> >::compress(bool)::'lambda0'()>(boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1> const&, papilo::ConstraintMatrix<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1> >::compress(bool)::'lambda'() const&, tbb::task_group_context&) in libpapilo-core.a(ConstraintMatrix.cpp.o)
      void tbb::parallel_invoke<papilo::ConstraintMatrix<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1> >::compress(bool)::'lambda1'(), papilo::ConstraintMatrix<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1> >::compress(bool)::'lambda2'(), papilo::ConstraintMatrix<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1> >::compress(bool)::'lambda3'(), papilo::ConstraintMatrix<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1> >::compress(bool)::'lambda4'(), papilo::ConstraintMatrix<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1> >::compress(bool)::'lambda5'()>(boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1> const&, papilo::ConstraintMatrix<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1> >::compress(bool)::'lambda1'() const&, papilo::ConstraintMatrix<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1> >::compress(bool)::'lambda2'() const&, papilo::ConstraintMatrix<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1> >::compress(bool)::'lambda3'() const&, papilo::ConstraintMatrix<boost::multiprecision::number<boost::multiprecision::backends::gmp_float<35u>, (boost::multiprecision::expression_template_option)1> >::compress(bool)::'lambda4'() const&, tbb::task_group_context&) in libpapilo-core.a(ConstraintMatrix.cpp.o)
      ...
[...]

  "typeinfo for tbb::task", referenced from:
      typeinfo for tbb::empty_task in libpapilo-core.a(ConstraintMatrix.cpp.o)
      typeinfo for tbb::internal::function_invoker<papilo::ConstraintMatrix<double>::compress(bool)::'lambda0'()> in libpapilo-core.a(ConstraintMatrix.cpp.o)
      typeinfo for tbb::internal::function_invoker<papilo::ConstraintMatrix<double>::compress(bool)::'lambda'()> in libpapilo-core.a(ConstraintMatrix.cpp.o)
      typeinfo for tbb::internal::spawner<2ul, papilo::ConstraintMatrix<double>::compress(bool)::'lambda5'(), papilo::ConstraintMatrix<double>::compress(bool)::'lambda4'(), tbb::internal::parallel_invoke_helper::parallel_invoke_noop> in libpapilo-core.a(ConstraintMatrix.cpp.o)
      typeinfo for tbb::internal::function_invoker<papilo::ConstraintMatrix<double>::compress(bool)::'lambda4'()> in libpapilo-core.a(ConstraintMatrix.cpp.o)
      typeinfo for tbb::internal::spawner<2ul, papilo::ConstraintMatrix<double>::compress(bool)::'lambda3'(), papilo::ConstraintMatrix<double>::compress(bool)::'lambda2'(), tbb::internal::parallel_invoke_helper::parallel_invoke_noop> in libpapilo-core.a(ConstraintMatrix.cpp.o)
      typeinfo for tbb::internal::function_invoker<papilo::ConstraintMatrix<double>::compress(bool)::'lambda2'()> in libpapilo-core.a(ConstraintMatrix.cpp.o)
      ...
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [bin/papilo] Error 1
make[1]: *** [binaries/CMakeFiles/papilo-executable.dir/all] Error 2
make: *** [all] Error 2

我尝试重新安装 tbb 或在 makefile 中指定 tbb 库的位置,但没有任何帮助。

有没有人遇到过类似的问题可以帮助我?

不幸的是,PaPILO 需要 TBB2020,无法处理 TBB2021(至少对于当前版本 1.x)。

因此我建议检查您安装的是哪个 TBB 版本,并确保您安装了 TBB2020。

另一方面,如果 PaPILO 找不到 TBB 库,PaPILO 会从外部源构建静态 TBB 库。