Проблемы при сборке Drake из источника с помощью cmake - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь собрать и установить Drake из исходного кода, чтобы получить поддержку Mosek. Однако я продолжаю сталкиваться с неприятностями. Для записи я использую macOS Catalina.

Прямо сейчас мой подход был таким:

  1. Клон Дрейка из github в папку на моем компьютере (из https://github.com/RobotLocomotion/drake.git)
  2. Установите prereqs с помощью ./setup/mac/install_prereqs.sh
  3. Выполните bazel build //... Создайте каталог с именем build и cd build cmake .., а затем make и make install
  4. И в моем C ++ проект, который я создаю с помощью cmake, я добавляю это в CMakeLists.txt: link_directories(drakelocation/build/install/lib) include_directories(drakelocation/build/install/include)

Однако, когда я пытаюсь построить свой проект, я получаю ошибку, которую Дрейк не может найти Эйген: 'Eigen/Core' file not found. Я смог обойти это, добавив:

target_link_libraries(my_lib Eigen3::Eigen) к моему CMakeLists.txt

Я нашел это немного странным, так как я ожидаю, что Дрейк включает Eigen, когда он собирается, но по крайней мере, это дало мне возможность продвинуться немного дальше.

После этого я получаю кучу сообщений типа: no member named 'signbit' in the global namespace

т.е. кажется, что Дрейк внезапно пропускает все стандартные Библиотеки C ++. Я еще не смог решить эту проблему, поэтому я застрял в этом месте.

У вас есть какие-либо предложения, или вы уже сталкивались с подобными проблемами раньше?

Другая информация:

  • Использование find_package(drake) вообще не работает с моим текущим подходом (cmake не может найти drake-config.cmake). Я что-то упускаю здесь, что требуется для этой работы? Где cmake ожидает установки библиотек и как их установить в этом месте?
  • Я также попытался пропустить весь шаг bazel build //..., перейдя непосредственно к шагу cmake .., который не показался чтобы что-то изменить.
  • В промежутке между различными подходами к сборке я запустил bazel clean --expunge, чтобы убедиться, что ничего не осталось от предыдущего запуска.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 20 апреля 2020

Спасибо @ Jam ie, который решил мою проблему с find_package ().

У меня все еще были проблемы со сборкой. Оказывается, что-то не так с моим стандартным путем SDK, и что установка «CMAKE_OSX_SYS ROOT» в соответствии с этим: Catalina C ++: Использование заголовков приводит к ошибке: ни один член с именем 'signbit' в глобальном пространстве имен после обновления до XCode добился цели.

После этого я получил много странных сообщений об ошибках от Eigen, жалуясь на то, что, например, MatrixXd не было определено в пространстве имен 'Eigen'. По какой-то причине удаление его с помощью brew uninstall eigen, а затем загрузка и сборка eigen из исходного кода решили эти проблемы.

Теперь это работает!

0 голосов
/ 20 апреля 2020

Вы должны указать CMake, где находится ваша установка Drake:

list(APPEND CMAKE_PREFIX_PATH /absolute/path/to/drakelocation/build/install)
find_package(drake REQUIRED)

add_library(my_lib ...)
target_link_libraries(my_lib drake::drake)

Это гарантирует, что у вас есть все необходимые флаги компилятора и компоновщика. Установка для каталога включения просто /absolute/path/to/drakelocation/build/install/include недостаточна, так как он не содержит каталоги включения различных зависимостей Drake.

Обратите внимание, что вам не нужно звонить bazel самостоятельно, прежде чем звонить cmake. Когда вы запускаете make install, он будет вызывать bazel внутри.

...