eigen库安装_CMakeLists.txt中常用库文件的查找和链接

34afb5bdfcc083e1b5119b61a777b246.png

CMake链接库的基本套路

在使用CMake组织工程时,如果我们需要依赖某个库文件,需要完成以下步骤:

  1. 查找库文件(find_package命令)
  2. 判断是否找到库文件(XXX_FOUND标记),并包含头文件(include_directories命令)
  3. 链接库文件到目标(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
ubuntu16.04+eigen3安装 - 灰色的石头 - 博客园​www.cnblogs.com

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宏已打开

对于自定义的库,库文件和头文件的名称可能有所区别。