使用 cmake 从源代码构建 Drake 时出现的问题
Problems when building Drake from source with cmake
我正在尝试从源代码构建和安装 Drake,以获得对 Mosek 的支持。然而,我一直 运行ning 惹麻烦。作为记录,我是 运行ning macOS Catalina。
现在我的方法是这样的:
- 将 drake 从 github 克隆到我计算机上的某个位置(从 https://github.com/RobotLocomotion/drake.git)
- 安装先决条件
./setup/mac/install_prereqs.sh
- 运行
bazel build //...
制作一个
名为 build
和 cd build
cmake ..
的目录,然后是 make
和 make install
- 在我使用 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
以确保没有任何东西与之前的 运行. 遗留
谢谢!
您需要告诉 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 解决了这些问题。
现在可以使用了!
我正在尝试从源代码构建和安装 Drake,以获得对 Mosek 的支持。然而,我一直 运行ning 惹麻烦。作为记录,我是 运行ning macOS Catalina。
现在我的方法是这样的:
- 将 drake 从 github 克隆到我计算机上的某个位置(从 https://github.com/RobotLocomotion/drake.git)
- 安装先决条件
./setup/mac/install_prereqs.sh
- 运行
bazel build //...
制作一个 名为build
和cd build
cmake ..
的目录,然后是make
和make install
- 在我使用 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
以确保没有任何东西与之前的 运行. 遗留
谢谢!
您需要告诉 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 解决了这些问题。
现在可以使用了!