CMake链接库的基本套路
在使用CMake组织工程时,如果我们需要依赖某个库文件,需要完成以下步骤:
- 查找库文件(find_package命令)
- 判断是否找到库文件(XXX_FOUND标记),并包含头文件(include_directories命令)
- 链接库文件到目标(target_link_libraries命令)
因此,库文件、头文件的名字(大小写)我们就要清楚的写明,不要混淆。我常用的库如OpenCV, catkin, Boost, Eigen, glog, gtest等,其用法如下。常用的变量有:name_INCLUDE_DIRS, name_INCLUDE_DIR, NAME_INCLUDE_DIRS, NAME_INCLUDE_DIR; name_LIBS, NAME_LIBS, name_LIBRARIES, NAME_LIBRARIES等。
OpenCV
#查找OpenCV是否安装
Boost
#查找Boost是否安装
ROS catkin
#查找catkin是否安装
Eigen
Eigen比较特殊, Eigen采用源码的方式提供给用户使用,在使用时只需要包含Eigen的头文件即可进行使用。之所以采用这种方式,是因为Eigen采用模板方式实现,由于模板函数不支持分离编译,所以只能提供源码而不是动态库的方式供用户使用。
#查找Eigen3是否安装
Eigen的默认安装路径是/usr/local/include/eigen3/Eigen,安装后需要将Eigen文件夹移动到/usr/local/include/下,可以执行如下语句,请参考下方博客。
sudo cp -r /usr/local/include/eigen3/Eigen /usr/local/include
glog
先安装好glog。安装后,无需在CMakeLists.txt中 find_package() 和 include_directories(),直接 target_link_libraries()。
target_link_libraries
记得在使用glog的文件中包含头文件。
#include
gtest
先安装好gtest。安装后,无需在CMakeLists.txt中 find_package() 和 include_directories(),直接 target_link_libraries()。
FILE
一般测试文件夹test会放在工程内和 src、include 文件夹同级别的位置,在test文件夹内存放不同的测试文件test cases,并包含头文件。具体的请参考gtest的tutorials。
#include
另外,要记得通过main() 运行所有的test cases。如下:
#include
CMake 输出信息
执行Reload CMake Project后的输出信息如下(不同的机器不同的安装路径输出会不一样):
-- 找到OpenCV:"/opt/ros/kinetic/include/opencv-3.3.1;/opt/ros/kinetic/include/opencv-3.3.1/opencv",ENABLE_OPENCV宏已打开
-- 找到OpenCV:"opencv_core;opencv_highgui;opencv_imgproc;opencv_imgcodecs"
-- Boost version: 1.58.0
-- Found the following Boost libraries:
-- regex
-- graph
-- chrono
-- thread
-- system
-- filesystem
-- serialization
-- date_time
-- atomic
-- 找到Boost:"/usr/include",ENABLE_BOOST宏已打开
-- 找到Boost:"/usr/lib/x86_64-linux-gnu/libboost_regex.so;/usr/lib/x86_64-linux-gnu/libboost_graph.so; ... ...
-- .......省略........
-- 找到catkin:"/home/gjs/catkin_ws/devel/include;/home/gjs/catkin_ws/src/geometry/tf/include; ... ...
-- 找到catkin:"/opt/ros/kinetic/lib/libtf.so;/opt/ros/kinetic/lib/libtf2_ros.so; ... ...
-- 找到Eigen3:"/usr/include/eigen3",ENABLE_EIGEN3宏已打开
对于自定义的库,库文件和头文件的名称可能有所区别。