cmake1:如何编写CMakeLists.txt

  • 注:转载自:链接;该作者的cmake系列都很好,值得一看。

如何编写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(<dir> <variable>)

该命令会查找指定目录下的所有源文件将结果存进指定变量名

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(<name> [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 )

将库文件链接到可执行程序上

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值