我的cmakelist包(在/home/xxx/catkin_Drone/src/Flight_Control_ROS/CMakeLists.txt):
cmake_minimum_required(VERSION 3.0.2)
project(flight_control)
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
sensor_msgs
dji_osdk_ros
sensor_msgs
)
find_package(OpenCV REQUIRED)
include_directories(include ${OpenCV_INCLUDE_DIRS})
link_directories(${OpenCV_LIBRARIES})
catkin_package(
INCLUDE_DIRS include
# LIBRARIES flight_control
CATKIN_DEPENDS roscpp rospy std_msgs
# DEPENDS system_lib
)
include_directories(
include
include/macro_lib
include/math_lib
include/ctrl_lib
${catkin_INCLUDE_DIRS}
)
FILE(GLOB SOURCE_FILES src/*.c src/*.cpp)
add_library(src ${SOURCE_FILES})
link_libraries(src)
add_executable(land_control land_control.cpp)
add_dependencies(land_control ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(land_control ${catkin_LIBRARIES} jsoncpp)
编译后运行flight_control这个工程包的land_control节点:
rosrun flight_control land_control
解读
- cmake_minimum_required–>指定CMake版本
- project(flight_control)->指定CMake工程名,也就是最后生成的
- find_package(catkin REQUIRED COMPONENTS ->需要依赖catkin包和其他包(或者组件)
- include_directories ->生成目标之前先写好包含路径和库路径
- link_directories->用于添加额外的库路径,但通常不推荐这样做,因为 所有catkin和CMake软件包在find_packaged时都会自动添加链接信息。 只需写target_link_libraries()中就可以了
- catkin_package->catkin特定的信息信息输出到构建系统上,用于生成pkg配置文件以及CMake文件。
这个命令必须在add_library()或者add_executable()之前调用 - FILE ->指定文件
- add_library ->用于指定要构建的库
- link_libraries- >指定可执行目标链接的库
- add_executable->要指定必须构建的可执行目标
- add_dependencies->为自动生成的消息目标创建明确的依赖关系,以便以正确的顺序构建它们
- target_link_libraries->指定可执行目标链接的库。 通常在add_executable()调用之后完成。 如果找不到ros,则添加$ {catkin_LIBRARIES}
cmake与make相比
CMake解决了同样的问题(以及更多),但与GNU Build System相比有一些优势.
用于编写CMakeLists.txt文件的语言可读且易于理解.
它不仅依靠make来构建项目.它支持多个生成器,如Visual Studio,Xcode,Eclipse等.
将CMake与make进行比较时,使用CMake还有其他几个优点:
系统库的跨平台发现.
自动发现和配置工具链.
更容易以平台无关的方式将文件编译到共享库中,并且通常比make更容易使用