为Git项目制作外部项目 [英] CMake External Project for Git Project

查看:13
本文介绍了为Git项目制作外部项目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在Cmake中添加外部GitHub项目时遇到问题。 其目的是在一个ROS(Catkin)项目中使用GitHub包Academy o。 安装说明可在以下位置找到: http://acado.github.io/install_linux.html

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

git clone https://github.com/acado/acado.git -b stable ACADOtoolkit
转到ACADOTOOLKIT文件夹并为 源代码外版本:

cd ACADOtoolkit  
mkdir build   
cd build

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

cmake .. make
要使用此包,我想下载ACADOTOOLKIT以 并在那里构建该文件夹:

catkin_ws/src/myProj/thirdparty/
出于这个原因,我将ACADOTOOLKIT添加为外部项目。 我必须将项目克隆到第三方文件夹中,以便获得:

catkin_ws/src/myProj/thirdparty/ACADOtoolkit
之后,我必须创建一个Build文件夹 Catkin_ws/src/myProj/thirdparty/ACADOtoolkit/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文件夹中创建Build文件夹 因此我收到

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
 )
此外,每次我想要构建项目时, 必须在此之前删除该目录。 有什么想法可以解决这些问题并内置源代码吗?

推荐答案

目标是在ROS(Catkin)项目中使用GitHub包Academy o。

如果这是您的主要目标,我建议您只需在您的工作区之外单独构建Academy,然后在您的ROS包中实现它,包括将其作为依赖项。我已成功完成此操作,因此我将使用此解决方案进行回答。

我支持这个解决方案而不是您建议的解决方案的理由是,Academy o是一个外部库,您(我假设)不会自己重新编码,因此,在每次重新构建工作区时重新构建它,或者将它与您自己的自定义代码一起包含在包中是没有意义的。

不管怎样,这就是您需要的...

pacakge.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}
)

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

# 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构建自动执行整个Academy o的克隆和安装,您可能希望将其放在一个脚本中,并考虑使用add_custom_command来执行它(不过我自己还没有尝试过)。

但我想重申这一论点,即外部库不应该包含在包中并构建在包中。对于想要使用您的包的人,假设他们负责满足构建依赖关系,这就是Catkin的构建依赖关系的目的,而且它并不像Academy有一个复杂的安装过程。

这篇关于为Git项目制作外部项目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆