4

我在 Cmake 中添加外部 github 项目时遇到问题。目的是在 ROS (Catkin) 项目中使用 github 包 ACADO。安装说明可以在这里找到:http: //acado.github.io/install_linux.html

请下载工具包代码。我们的建议是始终克隆稳定的分支:

git clone https://github.com/acado/acado.git -b stable ACADOtoolkit

转到 ACDOtoolkit 文件夹并为源外构建创建一个构建文件夹:

cd ACADOtoolkit  
mkdir build   
cd build

运行 CMake 以生成 makefile 并开始构建过程:

cmake .. make

要使用这个包,我想将 ACDOtoolkit 下载到该文件夹​​并在那里构建它:

catkin_ws/src/myProj/thirdparty/

出于这个原因,我将 ACDOtoolkit 添加为外部项目。我必须将项目克隆到第三方文件夹中,这样我才能得到:

catkin_ws/src/myProj/thirdparty/ACADOtoolkit

之后我必须创建一个构建文件夹 catkin_ws/src/myProj/thirdparty/ACDOtoolkit/build 然后构建项目:

cd catkin_ws/src/myProj/thirdparty/ACADOtoolkit/build
cmake ..
make

我可以使用以下命令成功地将项目下载到 catkin_ws/src/myProj/thirdparty/:

 ExternalProject_Add(acadooo
   DOWNLOAD_COMMAND git clone https://github.com/acado/acado.git -b stable ACADOtoolkit
   DOWNLOAD_DIR ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/
 )

不幸的是,我之后无法构建系统

 ExternalProject_Add(acado
    DOWNLOAD_COMMAND git clone https://github.com/acado/acado.git -b stable ACADOtoolkit
    DOWNLOAD_DIR ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/
    BINARY_DIR ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/ACADOtoolkit/build/
    BUILD_COMMAND make 
 )

因为构建文件夹应该在 ACACADOtoolkit 文件夹中创建,因此我收到

destination path 'ACADOtoolkit' already exists and is not an empty directory.

在源代码中构建也以相同的错误结束。

 ExternalProject_Add(acado
    DOWNLOAD_COMMAND git clone https://github.com/acado/acado.git -b stable ACADOtoolkit
    DOWNLOAD_DIR ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/
    SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/build/
    BUILD_COMMAND make 
    BUILD_IN_SOURCE 1
 )

此外,每次我想构建项目时,都必须先删除该目录。任何想法如何解决这些问题并在源代码中构建?

4

1 回答 1

1

目的是在 ROS (Catkin) 项目中使用 github 包 ACADO。

如果这是您的主要目标,我建议您只需在工作空间之外单独构建 ACADO,然后在您的 ROS 包中实现它,包括它作为依赖项。我已经成功地做到了这一点,所以我会用这个解决方案来回答。

我对您提出的解决方案的推理是 ACADO 是一个外部库,您(我假设)不会自己重新编码,因此每次重新构建工作区时重新构建它是没有意义的,也不要将其与您自己的自定义代码一起包含在包中。

无论如何,这就是你需要的......

打包.xml

放入构建依赖:

<build_depend>acado</build_depend>

CMakeLists.txt

在您的find_package( catkin REQUIRED COMPONENTS ...通话插入后:

find_package(ACADO REQUIRED)
find_package(Eigen3 REQUIRED)

在您的catkin_package通话中包括:

catkin_package(
# INCLUDE_DIRS include
# LIBRARIES 
# CATKIN_DEPENDS
 DEPENDS ACADO
)

然后直接在之后:

###########
## Build ##
###########

link_directories(${ACADO_LIBRARY_DIRS})

## Specify additional locations of header files
## Your package locations should be listed before other locations
# include_directories(include)
include_directories(
  include/${PROJECT_NAME}
  ${catkin_INCLUDE_DIRS}
  ${ACADO_INCLUDE_DIRS}
  ${Eigen_INCLUDE_DIRS}
)

下面是一个使用 ACADO 库的名为test的可执行文件的示例:

# Declare a C++ executable
# With catkin_make all packages are built within a single CMake context
# The recommended prefix ensures that target names across packages don't collide
add_executable(${PROJECT_NAME}_test src/test.cpp)

# Rename C++ executable without prefix
# The above recommended prefix causes long target names, the following renames the
# target back to the shorter version for ease of user use
# e.g. "rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node"
set_target_properties(${PROJECT_NAME}_test PROPERTIES OUTPUT_NAME test PREFIX "")

# Add cmake target dependencies of the executable
# same as for the library above
add_dependencies(${PROJECT_NAME}_test ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

## Specify libraries to link a library or executable target against
target_link_libraries(${PROJECT_NAME}_test ${PROJECT_NAME}
  ${catkin_LIBRARIES}
  ${ACADO_SHARED_LIBRARIES}
)

如果您坚持通过 catkin 构建自动化 ACADO 的整个克隆和安装,您可能希望将其放在脚本中并查看使用add_custom_command执行它(但是我自己没有尝试过)。

但我想重申一个论点,即外部库不应该包含在包中并构建在包中。对于想要使用你的包的人来说,假设他们负责满足构建依赖项,这就是 catkin 的构建依赖项的用途,而且 ACADO 的安装过程并不复杂。

于 2017-07-14T19:12:00.480 回答