1

我安装了 Eigen 和 Ceres-Solver 以及 brew 作为现有项目的先决条件。

当我为项目运行 make 时,我收到以下消息

找到 Eigen 依赖项,但找到的 Eigen 版本(3.3.1)与编译的 Eigen Ceres 版本(3.3.0)不完全匹配。这可能会通过触发违反单一定义规则而导致细微的错误。有关更多详细信息,请参阅 Wikipedia 文章 http://en.wikipedia.org/wiki/One_Definition_Rule

我的第一个想法是使用 brew 的 Eigen 从源代码编译 Ceres-solver,但这会在 make 期间产生其他错误消息。

具体来说,它最多可建立 54%,然后打印

[ 54%] Linking C executable ../bin/curve_fitting_c
Undefined symbols for architecture x86_64:
  "___kmpc_atomic_fixed4_sub", referenced from:
      __ZN5Eigen8internal29general_matrix_matrix_productIldLi1ELb0EdLi1ELb0ELi0EE3runElllPKdlS4_lPdldRNS0_15level3_blockingIddEEPNS0_16GemmParallelInfoIlEE in libceres.a(gradient_checker.cc.o)
      __ZN5Eigen8internal29general_matrix_matrix_productIldLi1ELb0EdLi0ELb0ELi0EE3runElllPKdlS4_lPdldRNS0_15level3_blockingIddEEPNS0_16GemmParallelInfoIlEE in libceres.a(dogleg_strategy.cc.o)

__ZN5ceres8internal11EventLoggerC2ERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE in libceres.a(wall_time.cc.o)
  __ZN5ceres8internal11EventLoggerC1ERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE in libceres.a(wall_time.cc.o)
  __ZN5ceres8internal11EventLoggerD2Ev in libceres.a(wall_time.cc.o)

...跳过一些行...

    __ZN5ceres8internal11EventLogger8AddEventERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE in libceres.a(wall_time.cc.o)
ld: symbol(s) not found for architecture x86_64
clang-3.5: error: linker command failed with exit code 1 (use -v to see invocation)

ceres安装页面推荐 Eigen 3.2.2 或更高版本,所以 3.3.1 应该没问题,除非 3.2 和 3.3 之间有一些结构变化。

我的问题:

我应该尝试的下一步是什么?安装旧版本的 Eigen?

4

1 回答 1

1

我试图使用ceres 网站上的说明从源代码构建 ceres 。我仍然不确定为什么会失败,但是使用 brew 从源代码构建(我以前不知道存在的一个选项)是可行的。

brew install --build-from-source ceres-solver

它使用通过 brew (Eigen 3.3.1) 安装的 Eigen 依赖项,并且不会产生任何错误消息。

于 2017-01-18T20:19:16.863 回答