为Git项目制作外部项目 [英] CMake External Project for Git Project
问题描述
在Cmake中添加外部GitHub项目时遇到问题。 其目的是在一个ROS(Catkin)项目中使用GitHub包Academy o。 安装说明可在以下位置找到: http://acado.github.io/install_linux.html
要使用此包,我想下载ACADOTOOLKIT以 并在那里构建该文件夹:请下载工具包代码。我们的建议是永远克隆 稳定分支:
转到ACADOTOOLKIT文件夹并为 源代码外版本:git clone https://github.com/acado/acado.git -b stable ACADOtoolkit
cd ACADOtoolkit mkdir build cd build
运行CMake以生成生成文件并开始构建过程:
cmake .. make
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屋!