匹配Eigen和Ceres-Solver版本的最简单方法是什么?

时间:2017-01-18 19:22:02

标签: c++ homebrew eigen ceres-solver

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

当我为项目运行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 installation page建议使用Eigen 3.2.2或更高版本,因此3.3.1应该没问题,除非3.2和3.3之间存在一些结构性变化。

我的问题:

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

1 个答案:

答案 0 :(得分:1)

我试图使用the instructions on the ceres website从源代码构建ceres。我仍然不确定为什么会失败,但是使用brew(我以前不知道的选项)从源代码构建起作用。

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

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