CMakeLists.txt链接库的基本套路
在使用CMake组织工程时,如果我们需要依赖某个库文件,需要完成以下步骤:
- 查找库文件(find_package命令)
- 判断是否找到库文件(XXX_FOUND标记),并包含头文件(include_directories命令)
- 链接库文件到目标(target_link_libraries命令)
因此,库文件、头文件的名字(大小写)我们就要清楚的写明,不要混淆。我常用的库如OpenCV, catkin, Boost, Eigen等,其用法如下。常用的变量有:name_INCLUDE_DIRS, name_INCLUDE_DIR, NAME_INCLUDE_DIRS, NAME_INCLUDE_DIR; name_LIBS, NAME_LIBS, name_LIBRARIES, NAME_LIBRARIES等。
OpenCV
#查找OpenCV是否安装
find_package(OpenCV REQUIRED core highgui imgproc imgcodecs)
if (OPENCV_FOUND)
message(STATUS "找到OpenCV:\"${OpenCV_INCLUDE_DIRS}\",ENABLE_OPENCV宏已打开")
message(STATUS "找到OpenCV:\"${OpenCV_LIBS}\"")
include_directories(${OpenCV_INCLUDE_DIRS})
add_definitions(-DENABLE_OPENCV)
list(APPEND LINK_LIB_LIST ${OpenCV_LIBS})
endif (OPENCV_FOUND)
Boost
#查找Boost是否安装
find_package(Boost REQUIRED COMPONENTS
regex
graph
chrono
thread
system
filesystem
serialization)
if (Boost_FOUND)
message(STATUS "找到Boost:\"${Boost_INCLUDE_DIRS}\",ENABLE_BOOST宏已打开")
message(STATUS "找到Boost:\"${Boost_LIBRARIES}\"")
include_directories(${Boost_INCLUDE_DIRS})
add_definitions(-DENABLE_BOOST)
list(APPEND LINK_LIB_LIST ${Boost_LIBRARIES})
endif (Boost_FOUND)
ROS catkin
#查找catkin是否安装
find_package(catkin REQUIRED COMPONENTS
geometry_msgs
roscpp
tf
)
if (catkin_FOUND)
message(STATUS "找到catkin:\"${catkin_INCLUDE_DIRS}\",ENABLE_CATKIN宏已打开")
message(STATUS "找到catkin:\"${catkin_LIBRARIES}\"")
include_directories(${catkin_INCLUDE_DIRS})
add_definitions(-DENABLE_CATKIN)
list(APPEND LINK_LIB_LIST ${catkin_LIBRARIES})
endif (catkin_FOUND)
Eigen
Eigen比较特殊, Eigen采用源码的方式提供给用户使用,在使用时只需要包含Eigen的头文件即可进行使用。之所以采用这种方式,是因为Eigen采用模板方式实现,由于模板函数不支持分离编译,所以只能提供源码而不是动态库的方式供用户使用。
#查找Eigen3是否安装
find_package(Eigen3 REQUIRED)
if (EIGEN3_FOUND)
message(STATUS "找到Eigen3:\"${EIGEN3_INCLUDE_DIR}\",ENABLE_EIGEN3宏已打开")
include_directories(${EIGEN3_INCLUDE_DIR})
add_definitions(-DENABLE_EIGEN3)
# list(APPEND LINK_LIB_LIST ${EIGEN3_LIBRARIES})
endif (EIGEN3_FOUND)