转载自:https://mp.weixin.qq.com/s/cvyihruVtzpMpxhETC0DfA
【技巧一分钟】CMakeLists.
原创 paopaoslam 泡泡机器人SLAM 2020-01-25
作者:吴奇
本期一分钟主要带大家浏览下CMakeList的相关知识。通常拿到一份SLAM源代码的时候,我们通常离不开下面几个指令:
-
mkdir build && cd build
-
cmake ..
-
make -j
或者是
-
catkin_make
这里所有的编译指令都离不开源码中的一个特殊文件CMakeLists。对于初期SLAM新手来说,很多同学上来就无脑敲着几个命令,结果出来一堆报错,但又不知道怎么回事。本期泡泡源代码组就和大家一起看看如何在CMakeLists中设置第三方库,我们首先来看的还是经典SLAM代码ORB_SLAM2中的CMakeLists。
ORB_SLAM的CMakeLists
-
cmake_minimum_required(VERSION 2.8)
-
project(ORB_SLAM2)
-
IF(NOT CMAKE_BUILD_TYPE_)
-
SET(CMAKE_BUILD_TYPE RELEASE)
-
ENDIF
-
MESSAGE("Build type: " ${CMAKE_BUILD_TYPE})
-
...
-
find_package(Eigen3 3.1.0 REQUIRED)
-
find_package(Pangolin REQUIRED)
-
find_package(OpenCV 3.0 QUIET)
-
include_directories(
-
${PROJECT_SOURCE_DIR}
-
${PROJECT_SOURCE_DIR}/include
-
${EIGEN3_INCLUDE_DIR}
-
${Pangolin_INCLUDE_DIRS}
-
...
-
)
-
...
-
target_link_libraries(
-
${PROJECT_NAME}
-
${EIGEN3_LIBS}
-
${Pangolin_LIBRARIES}
-
${PROJECT_SOURCE_DIR}/Thirdparty/DBoW2/lib/libDBoW2.so
-
${PROJECT_SOURCE_DIR}/Thirdparty/g2o/lib/libg2o.so
-
)
通过ORB_SLAM2中的CMakeLists会发现,一般来说,用CMakelists来链接第三方库通常都离不开三个命令:
-
// 参数QUIET表示紧掉包没有被发现时的警告信息, REQUIRED表示若包没有找到则cmake过程停止
-
find_package(第三方包名 需要的最低版本号 REQUIRED/QUIET)
-
// 寻找包的头文件
-
include_directories(${包_INCLUDE_DIRS})
-
// 链接包的第三方库(这里是${包_LIBS}还是${包_LIBRARIES}需要依据具体的包来看)
-
target_link_libraries(${包_LIBS}或${包_LIBRARIES})
这里就完成了一般第三方库的连接,但是有的同学电脑中可能装了俩个版本的OpenCV,如何在CMakeLists中设置连接到哪个版本呢?
CMakeLists进阶-找包包
首先确定OpenCV不同版本在电脑中的安装位置,如笔者的就是在/usr/local下以不同版本号命名:
这里可以看到/usr/local下有两个不同版本opencv,opencv2.4.13和opencv3.4.8,下面来看看我们的CMakeLists如何改:
-
// 明确find_package的寻找路径
-
set(OpenCV_DIR /usr/local/opencv2.4.13/share/OpenCV)
-
find_package(OpenCV 2.4 REQUIRED)
-
// 告诉系统头文件在哪里
-
include_directories(SYSTEM ${OpenCV_INCLUDE_DIRS} /usr/local/opencv2.4.13/include)
-
// 告诉第三方库文件在哪里
-
link_directories(${OpenCV_LIBRARY_DIRS} /usr/local/opencv2.4.13/lib)
-
// 将库文件与项目链接上
-
target_link_libraries(${项目名} ${OpenCV_LIBRARY_DIRS})
这里我们就成功将项目中的OpenCV版本号指定好,可以愉快地进行开发了~ 本期的一分钟到这里就结束了~这是泡泡技巧一分钟的第一次推送,大家有什么好的建议或者想了解程序方面的某些知识,都可以在评论区留言,后面会陆续给大家带来更多精彩内容的分享~