使用 cmake 从源代码构建 Drake 时出现的问题

Problems when building Drake from source with cmake

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

现在我的方法是这样的:

  1. 将 drake 从 github 克隆到我计算机上的某个位置(从 https://github.com/RobotLocomotion/drake.git
  2. 安装先决条件 ./setup/mac/install_prereqs.sh
  3. 运行 bazel build //... 制作一个 名为 buildcd build cmake .. 的目录,然后是 makemake 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++ 库。我还没有能够解决这个问题,所以这是我目前卡住的地方。

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

其他信息:

谢谢!

您需要告诉 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)

这确保您拥有所有必要的编译器和链接器标志。将 include 目录简单地设置为 /absolute/path/to/drakelocation/build/install/include 是不够的,因为它不包含 Drake 的各种依赖项的 include 目录。

请注意,在调用 cmake 之前,您不需要自己调用 bazel。当你运行make install时,它会在内部调用bazel

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

我在构建时仍然遇到了一些问题。事实证明,我的默认 SDK 路径有问题,根据此设置 "CMAKE_OSX_SYSROOT":Catalina C++: Using <cmath> headers yield error: no member named 'signbit' in the global namespace 在更新到 XCode 后成功了。

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

现在可以使用了!