Mrli
别装作很努力,
因为结局不会陪你演戏。
Contacts:
QQ博客园

Cmake 入门

2019/09/15 C++
Word count: 1,074 | Reading time: 4min

Cmake 入门

入门案例:单个源文件

例如,假设现在我们的项目中只有一个源文件 main.cc ,该程序的用途是计算一个数的指数幂。

1.首先编写 CMakeLists.txt 文件,并保存在与 main.cc 源文件同个目录下

1
2
3
4
5
6
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 项目信息
project (Demo1)
# 指定生成目标
add_executable(Demo main.cc)

语法:

命令注释空格组成,其中命令是不区分大小写的。

  • 符号 # 后面的内容被认为是注释

  • 命令由命令名称、小括号和参数组成

  • 参数之间使用空格进行间隔

2.编译项目

之后,在当前目录执行 cmake . ,得到 Makefile 后再使用 make 命令编译得到 Demo1 可执行文件。

同一目录,多个源文件

如果多文件,结构变成

1
2
3
4
5
6
7
./Demo2
|
+--- main.cc
|
+--- MathFunctions.cc
|
+--- MathFunctions.h

cmakelist.txt需要改成

1
2
3
4
5
6
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 项目信息
project (Demo2)
# 指定生成目标
add_executable(Demo main.cc MathFunctions.cc)

区别: 即在 add_executable 命令中增加了一个 MathFunctions.cc 源文件

省事的方法是使用 aux_source_directory 命令,该命令会查找指定目录下的所有源文件,然后将结果存进指定变量名。语法为aux_source_directory(<dir> <variable>)

1
2
3
4
5
6
7
8
9
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 项目信息
project (Demo2)
# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)
# 指定生成目标
add_executable(Demo ${DIR_SRCS})

多个目录,多个源文件

文件结构:

1
2
3
4
5
6
7
8
9
./Demo3
|
+--- main.cc
|
+--- math/
|
+--- MathFunctions.cc
|
+--- MathFunctions.h

对于这种情况,需要分别在项目根目录 Demo3 和 math 目录里各编写一个 CMakeLists.txt 文件。为了方便,我们可以先将 math 目录里的文件编译成静态库再由 main 函数调用。

根目录中的 CMakeLists.txt :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 项目信息
project (Demo3)
# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)

# ▲添加 math 子目录
add_subdirectory(math)

# 指定生成目标
add_executable(Demo main.cc)
# 添加链接库
target_link_libraries(Demo MathFunctions)
  • 使用命令 add_subdirectory 指明本项目包含一个子目录 math,这样 math 目录下的 CMakeLists.txt 文件和源代码也会被处理.
  • 使用命令 target_link_libraries 指明可执行文件 main 需要连接一个名为 MathFunctions 的链接库

子目录中的 CMakeLists.txt:

1
2
3
4
5
# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_LIB_SRCS 变量
aux_source_directory(. DIR_LIB_SRCS)
# 生成链接库
add_library (MathFunctions ${DIR_LIB_SRCS})

在该文件中使用命令 add_library 将 src 目录中的源文件编译为静态链接库

摘自CMake 入门实战


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

环境变量

使用$ENV{NAME}指令就可以调用系统的环境变量了。比如MESSAGE(STATUS “HOME dir: $ENV{HOME}”)
设置环境变量的方式是:SET(ENV{变量名} 值)

dl、rt

1
2
3
4
5
6
7
target_link_libraries(agentspark
${RCSSNET3D_LIBRARY}
${Boost_SYSTEM_LIBRARY}
dl
${CMAKE_THREAD_LIBS_INIT}
rt
)

dllibdl.so,rtlibrt.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.

< PreviousPost
搭建frp服务--阿里云服务器
NextPost >
Python+adb操作手机
CATALOG
  1. 1. Cmake 入门
    1. 1.0.1. 入门案例:单个源文件
      1. 1.0.1.1. 1.首先编写 CMakeLists.txt 文件,并保存在与 main.cc 源文件同个目录下
      2. 1.0.1.2. 2.编译项目
    2. 1.0.2. 同一目录,多个源文件
    3. 1.0.3. 多个目录,多个源文件
      1. 1.0.3.1. 根目录中的 CMakeLists.txt :
      2. 1.0.3.2. 子目录中的 CMakeLists.txt:
    4. 1.0.4. set指令详解
      1. 1.0.4.1. 例子:
        1. 1.0.4.1.1. 一. CMAKE_SOURCE_DIR -->CMakeLists.txt所在的目录
        2. 1.0.4.1.2. 二.CMAKE_LIBRARY_OUTPUT_DIRECTORY–>cmake编译输出的东西应该放在什么地方
    5. 1.0.5. include包含库、头文件
      1. 1.0.5.0.1. 添加头文件路径,对应的函数叫include_directories
      2. 1.0.5.0.2. 添加库路径,对应的函数叫LINK_DIRECTORIES
      3. 1.0.5.0.3. 添加库,对应的函数叫LINK_LIBRARIES,把所有的库加进去即可
  2. 1.0.6. 环境变量
  3. 1.0.7. dl、rt