0

我正在尝试从源代码构建和安装 Drake,以获得对 Mosek 的支持。然而,我总是遇到麻烦。作为记录,我正在运行 macOS Catalina。

现在我的方法是这样的:

  1. 将 github 中的 drake 克隆到我计算机上的某个位置(来自https://github.com/RobotLocomotion/drake.git
  2. 安装先决条件./setup/mac/install_prereqs.sh
  3. 运行bazel build //...创建一个名为buildandcd build cmake ..然后make 的目录make install
  4. 在我使用 cmake 构建的 C++ 项目中,我将其添加到 CMakeLists.txt: link_directories(drakelocation/build/install/lib) include_directories(drakelocation/build/install/include)

但是,当我尝试构建我的项目时,我收到 Drake 无法找到 Eigen: 的错误'Eigen/Core' file not found。我能够通过添加来解决这个问题:

target_link_libraries(my_lib Eigen3::Eigen)到我的 CMakeLists.txt

我觉得这有点奇怪,因为我希望 Drake 在构建时包含 Eigen,但至少这让我能够更进一步。

在此之后,我收到一堆类型的消息: no member named 'signbit' in the global namespace

即,Drake 似乎突然失去了所有标准 C++ 库。我还没有能够解决这个问题,所以这是我目前卡住的地方。

您有什么建议,或者您之前遇到过类似的问题吗?

其他信息:

  • 使用find_package(drake)根本不适用于我当前的方法(cmake 无法找到 drake-config.cmake)。我在这里遗漏了完成这项工作所需的东西吗?cmake 期望在哪里安装库,我如何在那个地方安装它们?
  • 我也试过跳过整个bazel build //...步骤,直接进入cmake ..步骤,这似乎没有任何区别。
  • 在我运行的每一种不同的构建方法之间bazel clean --expunge,以确保没有任何东西从前一次运行中遗留下来。

谢谢!

4

2 回答 2

0

感谢@Jamie 解决了我遇到的 find_package() 问题。

我仍然在构建方面遇到了一些问题。原来我的默认 SDK 路径有问题,并且根据以下设置“CMAKE_OSX_SYSROOT”:Catalina C++: Using <cmath> headers yield error: no member named 'signbit' in the global namespace after an update to XCode did诀窍。

在此之后,我从 Eigen 收到了很多奇怪的错误消息,抱怨 ieMatrixXd没有在命名空间“Eigen”中定义。出于某种原因,卸载它,brew uninstall eigen然后从源代码下载和构建 eigen 解决了这些问题。

现在可以了!

于 2020-04-20T17:05:13.833 回答
0

你需要告诉 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内部调用。

于 2020-04-20T14:00:47.420 回答