Cmake 入门
入门案例:单个源文件
例如,假设现在我们的项目中只有一个源文件 main.cc ,该程序的用途是计算一个数的指数幂。
1.首先编写 CMakeLists.txt 文件,并保存在与 main.cc 源文件同个目录下
1 | # CMake 最低版本号要求 |
语法:
由命令、注释和空格组成,其中命令是不区分大小写的。
-
符号
#
后面的内容被认为是注释 -
命令由命令名称、小括号和参数组成
-
参数之间使用空格进行间隔
2.编译项目
之后,在当前目录执行 cmake .
,得到 Makefile 后再使用 make
命令编译得到 Demo1 可执行文件。
同一目录,多个源文件
如果多文件,结构变成
1 | ./Demo2 |
cmakelist.txt
需要改成
1 | # CMake 最低版本号要求 |
区别: 即在 add_executable
命令中增加了一个 MathFunctions.cc
源文件
省事的方法是使用 aux_source_directory
命令,该命令会查找指定目录下的所有源文件,然后将结果存进指定变量名。语法为aux_source_directory(<dir> <variable>)
1 | # CMake 最低版本号要求 |
多个目录,多个源文件
文件结构:
1 | ./Demo3 |
对于这种情况,需要分别在项目根目录 Demo3 和 math 目录里各编写一个 CMakeLists.txt 文件。为了方便,我们可以先将 math 目录里的文件编译成静态库再由 main 函数调用。
根目录中的 CMakeLists.txt :
1 | # CMake 最低版本号要求 |
- 使用命令
add_subdirectory
指明本项目包含一个子目录 math,这样 math 目录下的 CMakeLists.txt 文件和源代码也会被处理. - 使用命令
target_link_libraries
指明可执行文件 main 需要连接一个名为 MathFunctions 的链接库
子目录中的 CMakeLists.txt:
1 | # 查找当前目录下的所有源文件 |
在该文件中使用命令 add_library
将 src 目录中的源文件编译为静态链接库
set指令详解
语法: SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
指令功能: 用来显式的定义变量
例子: SET (SRC_LST main.c other.c)
说明: 用变量代替值,例子中定义SRC_LST代替后面的字符串。
例子:
一. CMAKE_SOURCE_DIR -->CMakeLists.txt所在的目录
set(libs "${CMAKE_SOURCE_DIR}/src/main/jnilibs")
定义了一个变量libs,并且变量的值为${CMAKE_SOURCE_DIR}/src/main/jnilibs,其中CMAKE_SOURCE_DIR 是一个cmake内置变量,指定了CMakeLists.txt所在的目录
二.CMAKE_LIBRARY_OUTPUT_DIRECTORY–>cmake编译输出的东西应该放在什么地方
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/src/main/jnilibs/${ANDROID_ABI})
这个命令用于给CMAKE_LIBRARY_OUTPUT_DIRECTORY宏赋值,该宏指定了cmake编译输出的东西应该放在什么地方。
这个例子中的地方是${PROJECT_SOURCE_DIR}/src/main/jnilibs/${ANDROID_ABI}
其中PROJECT_SOURCE_DIR 是cmake内置宏,指向构建工程的全路径。
include包含库、头文件
添加头文件路径,对应的函数叫include_directories
添加库路径,对应的函数叫LINK_DIRECTORIES
添加库,对应的函数叫LINK_LIBRARIES,把所有的库加进去即可
环境变量
使用$ENV{NAME}
指令就可以调用系统的环境变量了。比如MESSAGE(STATUS “HOME dir: $ENV{HOME}”)
设置环境变量的方式是:SET(ENV{变量名} 值)
dl、rt
1 | target_link_libraries(agentspark |
dl是libdl.so
,rt是librt.so
的缩写···其实是静态加载了这两个动态链接库!!!
Author: Mrli
Link: https://nymrli.top/2019/02/18/Cmake-入门/
Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.