如何编写CMakeLists.txt文件
CMakeLists.txt 文件大小写不敏感
大型项目的根目录和子目录都会有这个文件
cmake_minimum_required( VERSION 2.8 )
这是声明要求的cmake编译器的最低版本
终端输入 cmake -version 可查看cmake的版本
project(slam)
这是声明cmake工程名字
project(slam VERSION 0.0.1)
还可以增加版本号
SET( CMAKE_CXX_COMPILER "g++")
设置使用g++编译器
这是添加变量的用法
set(KEY VALUE)
接收两个参数,用来声明变量。
在camke语法中使用${KEY}这种写法来取VALUE的值
set( CMAKE_CXX_FLAGS “-std=c++11 -march=native -O3” )
参数 “CMAKE_CXX_FLAGS”
含义是:set compiler for c++ language
“-std=c++11” 是添加c++11标准支持
这是 *.CPP 文件的编译选项
“-march=native”
指定目标程序用cpu架构来进行优化
“native”相当于自检测 cpu
“-march”是 gcc 优化选项
后面的“-O3”是用来调节编译时优化程度的
最高为 -O3,最低为 -O0 即不做优化
这个优化参数只有在参数
CMake -DCMAKE_BUILD_TYPE=release
时有效因为 debug 版的项目生成可执行文件需要有调试信息并且不需要进行优化而 release 版的不需要调试信息但需要优化
set(use_test ${SOURCES_DIRECTORY}/user_accounts.cpp) message("use_test :${use_test}")
message可以打印信息,类似于echo/printf,
主要用于查cmake文件的语法错误。
SET( CMAKE_BUILD_TYPE "Release" )
设置 cmake 编译模式有 debug 和 release 两种
PROJECT_SOURCE_DIR 是项目根目录也是CmakeLists.txt的绝对路径。
SET( EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
设定生成的可执行二进制文件要存放的目录
SET( LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
设定生成的库文件要存放的目录
SET(CMAKE_INSTALL_PREFIX install_path )
在 CMakeLists.txt 中指定安装位置
cmake -DCMAKE_INSTALL_PREFIX=/usr ..
在编译终端指定安装位置
LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/lib)
把该目录设为链接目录
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include)
设定头文件存放目录
ADD_SUBDIRECTORY(${PROJECT_SOURCE_DIR}/src)
增加子文件夹,也就是进入源代码文件夹继续构建
aux_source_directory(
)
该命令会查找指定目录下的所有源文件将结果存进指定变量名
find_package( OpenCV REQUIRED )
添加依赖,去寻找该库的头文件位置、库文件位置以及库文件名称,
并将其设为变量,返回提供给 CMakeLists.txt 其他部分使用。
在 CMakeLists.txt 中使用第三方库的三部曲
1. find_package
2. include_directories
3. target_link_libraries
include_directories(${OpenCV_INCLUDE_DIRS})
指定去哪里找头文件
target_link_libraries( ${OpenCV_LIBRARIES})
指定要链接的库文件
LINK_DIRECTORIES()
指定去哪里找库文件(.so/.lib/.ddl等)
“cmake_modules.cmake”文件是把 CMakeLists.txt 里用来寻找特定库的内容分离出来。
如果提示没有找到第三方依赖库可以尝试安装或者重新指定安装路径
安装的方法:
查找相关的软件包
apt-cache search 软件包名字
安装
sudo apt-get install 软件包名字
查找软件包头文件所在的路径
pkg-config --cflags 软件包名字
查找软件包库文件所在的路径
pkg-config --libs 软件包名字
手动指定安装路径:
# find_package(Eigen3 REQUIRED)
set(Eigen3_DIR /usr/lib/cmake/eigen3/Eigen3Config.cmake)set(EIGEN3_INCLUDE_DIRS /usr/local/include/eigen3)include_directories(${EIGEN3_INCLUDE_DIRS})
假如找不到Eigen3库,我们就设置变量来指定Eigen3的头文件位置
如何生成静态库".a"文件
如何生成共享库".so"文件
如何利用共享库生成可执行程序
add_library( [STATIC | SHARED | MODULE][EXCLUDE_FROM_ALL]source1 [source2 ...])
生成库的名字,直接写名字不加lib,会自动加上前缀。
SHARED动态库
STATIC静态库
SET(LIBHELLO_SRC hello.c) ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC}) ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})
一般我们使用的静态库/动态库只是后缀名不同而已,
上面是构建共享库 libhello.so 与静态库 libhello_static.a 的写法。
add_executable( useHello useHello.cpp )
生成一个可执行程序,add_executable( 程序名 源代码文件 )
target_link_libraries( useHello hello_shared )
将库文件链接到可执行程序上
实践视频
6月29日从赞赏用户中抽取一人福利二选一 送视觉SLAM十四讲从理论到实践一本送CSDN所有付费专栏中文章阅读答疑权限一年
微信交流群