Как проще всего сопоставить версии для Eigen и Ceres-Solver?

Я установил Eigen и Ceres-Solver с brew в качестве предпосылок для существующего проекта.

Когда я запускаю make для проекта, я получаю следующее сообщение

Найдена зависимость Eigen, но найденная версия Eigen (3.3.1) не совсем совпадает с версией Eigen Ceres, с которой была скомпилирована (3.3.0). Это может вызвать тонкие ошибки, вызывая нарушения правила одного определения. Подробнее см. в статье Википедии http://en.wikipedia.org/wiki/One_Definition_Rule.

Моей первой идеей было скомпилировать Ceres-solver из исходников с помощью Eigen из brew, но во время сборки это выдавало другие сообщения об ошибках.

В частности, он накапливается до 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?


person Cecilia    schedule 18.01.2017    source источник
comment
Ну, вы получите четкое предупреждение. Что вы ожидаете, что мы вам скажем? Нет, разработчики этого ПО понятия не имели, как работает их ПО?   -  person Marcus Müller    schedule 18.01.2017
comment
Ладно, справедливо. Я предположил, что ответ на первый вопрос будет отрицательным, но я немного озадачен тем, что делать дальше.   -  person Cecilia    schedule 18.01.2017


Ответы (1)


Я пытался собрать ceres из исходного кода, используя инструкции на веб-сайте ceres. Я до сих пор не уверен, почему это не удалось, но сборка из исходного кода с использованием brew (вариант, о существовании которого я раньше не знал) работает.

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

Он использует зависимость Eigen, установленную через brew (Eigen 3.3.1), и не выдает никаких сообщений об ошибках.

person Cecilia    schedule 18.01.2017