原理:
CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多。CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt文件转化为make所需要的makefile文件,最后用make命令编译源码生成可执行程序或共享库(so(shared object))。因此CMake的编译基本就两个步骤:
1. cmake
2. make
cmake 指向CMakeLists.txt所在的目录,例如cmake .. 表示CMakeLists.txt在当前目录的上一级目录。cmake后会生成很多编译的中间文件以及makefile文件,所以一般建议新建一个新的目录,专门用来编译,例如:
mkdir build
cd build
cmake ..
make
#1. cmake verson,指定cmake版本
cmake_minimum_required(VERSION3.2)
#2. project name,指定项目的名称,一般和项目的文件夹名称对应
PROJECT(XXX) #自己个自己的项目取个名字
#3 find_package:找到所需外部库的路径
find_package(
如果这样找不到的话,那就需要自己添加绝对路径,但是一般都可以找到,如果找不到就用 target_link_libraries 直接去链接 .so 文件。 后面会讲
#3. include_directories 添加头文件目录
include_directories(
${PROJECT_SOURCE_DIR}
${PROJECT_SOURCE_DIR}/include
${EIGEN3_INCLUDE_DIR}
${Pangolin_INCLUDE_DIRS}
)
#4 设置 ,是放置代码编译的 .so文件
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib)
#5 add_library 该指令的主要作用就是将指定的源文件生成链接文件,然后添加到工程中去。该指令常用的语法如下
add_library(${PROJECT_NAME} SHARED
src/map.cpp
src/tool.cpp
)
#6 link_directories :该指令的作用主要是指定要链接的库文件的路径,该指令有时候不一定需要。因为find_package和find_library指令可以得到库文件的绝对路径。不过你自己写的动态库文件放在自己新建的目录下时,可以用该指令指定该目录的路径以便工程能够找到。
link_directories(
lib
)
# add executablefile,添加要编译的可执行文件
add_executable($PROJECT_NAME$_main ./autonet.cpp)
#7 target_link_libraries:该指令的作用为将目标文件与库文件进行链接
target_link_libraries($PROJECT_NAME$_main
${OpenCV_LIBS} #因为前面find_package 已经找到了路径
${EIGEN3_LIBS}
${Pangolin_LIBRARIES}
${PROJECT_SOURCE_DIR}/Thirdparty/DBoW2/lib/libDBoW2.so
${PROJECT_SOURCE_DIR}/Thirdparty/g2o/lib/libg2o.so
)