目录
1.常用变量简介
1.1提供信息的变量
1.2改变行为的变量
1.3描述系统的变量
编辑1.4控制编译的变量
2.提供信息的变量
2.1PROJECT_SOURCE_DIR 和 PROJECT_BINARY_DIR
2.2 CMAKE_SOURCE_DIR 和 CMAKE_BINARY_DIR
2.3CMAKE_CURRENT_SOURCE_DIR 和CMAKE_CURRENT_BINARY_DIR
2.4 CMAKE_VERSION、CMAKE_MAJOR_VERSION 和 CMAKE_MINOR_VERSION
2.5PROJECT_VERSION、PROJECT_VERSION_MAJOR 和 PROJECT_VERSION_MINOR
2.6CMAKE_PROJECT_NAME 和 PROJECT_NAME
3.改变行为的变量
3.1 BUILD_SHARED_LIBS
3.2 CMAKE_BUILD_TYPE
3.3 CMAKE_SYSROOT
3.4 CMAKE_INCLUDE_PATH
3.5 CMAKE_LIBRARY_PATH
3.6 CMAKE_MODULE_PATH
3.7 CMAKE_INCLUDE_DIRECTORIES_BEFORE
3.8 CMAKE_IGNORE_PATH
4.描述系统的变量
4.1CMAKE_HOST_SYSTEM_NAME 、 CMAKE_HOST_SYSTEM_PROCESSOR 、CMAKE_HOST_SYSTEM 和 CMAKE_HOST_SYSTEM_VERSION
4.2 CMAKE_SYSTEM_NAME 、 CMAKE_SYSTEM_PROCESSOR 、 CMAKE_SYSTEM和CMAKE_SYSTEM_VERSION
4.3 ENV
5.控制编译的变量
5.1EXECUTABLE_OUTPUT_PATH 和 LIBRARY_OUTPUT_PATH
1)介绍
2)例子
目录结构
├── build
├── CMakeLists.txt
└── main.c
CMakeLists.txt
# CMakeLists.txt
cmake_minimum_required("VERSION" "3.5")
project(HELLO)
message(${PROJECT_SOURCE_DIR})
message(${PROJECT_BINARY_DIR})
执行结果
与上面等价
1)介绍
CMAKE_CURRENT_SOURCE_DIR当前源码的路径;
CMAKE_CURRENT_BINARY_DIR指的是当前源码的 BINARY_DIR;
2)例子
目录结构
├── build
├── CMakeLists.txt
├── main.c
└── src
└── CMakeLists.txt
CMakeLists.txt
# src 下的 CMakeLists.txt
message(${PROJECT_SOURCE_DIR})
message(${PROJECT_BINARY_DIR})
message(${CMAKE_CURRENT_SOURCE_DIR})
message(${CMAKE_CURRENT_BINARY_DIR})
执行结果
1)介绍
记录 cmake 的版本号
2)例子
目录结构
# CMakeLists.txt
message(${CMAKE_VERSION})
message(${CMAKE_MAJOR_VERSION})
message(${CMAKE_MINOR_VERSION})
执行结果
1)介绍
记录工程的版本号,其实可以给工程设置一个版本号,通过 project()命令进行设置
2)例子
# CMakeLists.txt
cmake_minimum_required("VERSION" "3.5")
project(HELLO VERSION 1.1.0) #设置工程版本号为 1.1.0
# 打印
message(${PROJECT_VERSION})
message(${PROJECT_VERSION_MAJOR})
message(${PROJECT_VERSION_MINOR})
执行结果
1)介绍
记录了工程的名字
2)例子
# CMakeLists.txt
cmake_minimum_required("VERSION" "3.5")
project(HELLO VERSION 1.1.0) #设置工程版本号为 1.1.0
# 打印工程名字
message(${CMAKE_PROJECT_NAME})
message(${PROJECT_NAME})
执行结果
1)介绍
对于 add_library()命令,当没有显式指定生成动态库时(SHARED 选项),默认生成的是静态库;其实我们可以通过 BUILD_SHARED_LIBS 变量来控制 add_library()命令的行为,当将变量设置为 on 时表示使能动态库,则 add_library()默认生成的便是动态库文件;当变量设置为 off 或未设置时,add_library()默认生成的便是静态库文件。
2)例子
├── build
├── CMakeLists.txt
├── hello
│ └── hello.c
└── world
└── world.c
# 顶层 CMakeLists.txt
cmake_minimum_required("VERSION" "3.5")
project(HELLO VERSION 1.1.0)
set(BUILD_SHARED_LIBS on)
add_library(hello hello/hello.c)
add_library(world world/world.c)
进入到 build 目录下,执行 cmake、make 进行构建、编译,将会生成动态库文件 libhello.so、libworld.so。
1)介绍
# Debug 版本
set(CMAKE_BUILD_TYPE Debug)
# Release 版本
set(CMAKE_BUILD_TYPE Release)
1)介绍
(1)为find_file()和find_path()命令指定搜索路径的目录列表。
(2)分别用于查找文件、路径,需要传入文件名。find_file()命令会将该文件的全路径返回;
find_path()会将文件的所在目录返回。
(3)在搜索文件的时候,需要通过CMAKE_INCLUDE_PATH 指定一个目录列表。find_file()和find_path()在这个目录列表中查找文件。
2)例子
├── build
├── CMakeLists.txt
└── src
└── hello.c
# CMakeLists.txt
cmake_minimum_required("VERSION" "3.5")
project(HELLO VERSION 1.1.0) #设置工程版本号为 1.1.0
# 设置 CMAKE_INCLUDE_PATH 变量
set(CMAKE_INCLUDE_PATH ${PROJECT_SOURCE_DIR}/src)
# 查找文件
find_file(P_VAR hello.c)
message(${P_VAR})
执行结果
指定 find_library()命令的搜索路径的目录列表。find_library()命令用于搜索库文件,find_library()将会从CMAKE_LIBRARY_PATH 变量设置的目录列表中进行搜索。
指定要由 include()或 find_package()命令加载的 CMake 模块的搜索路径的目录列表。
include_directories()命令默认情况下会将目录添加到列表的后面,如果将 CMAKE_INCLUDE_DIRECTORIES_BEFORE 设置为 on,则include_directories()命令会将目录添加到列表前面;同理若将 CMAKE_INCLUDE_DIRECTORIES_BEFORE 设置为 off 或未设置该变量,include_directories()会将目录添加到列表后面。
要被 find_program()、find_library()、find_file()和 find_path()命令忽略的目录列表。表示这些命令不会去CMAKE_IGNORE_PATH 变量指定的目录列表中搜索。
1)介绍
# 打印信息
message(${CMAKE_HOST_SYSTEM_NAME})
message(${CMAKE_HOST_SYSTEM_PROCESSOR})
message(${CMAKE_HOST_SYSTEM})
message(${CMAKE_HOST_SYSTEM_VERSION})
打印信息
1) 介绍
用于描述目标主机相关的信息,目标主机指的是可执行文件运行的主机,譬如我们的ARM 开发板。
2)例子
# 打印信息
message(${CMAKE_SYSTEM_NAME})
message(${CMAKE_SYSTEM_PROCESSOR})
message(${CMAKE_SYSTEM})
message(${CMAKE_SYSTEM_VERSION})
1)介绍
2)例子
# 访问环境变量
message($ENV{XXX})
首先在 Ubuntu 系统下使用 export 命令导出XXX 环境变量。
export XXX="Hello World!"
cd build/
cmake ..
执行结果
1)介绍
分别用来设置可执行文件的输出目录以及库文件的输出目录
2)例子
├── build
├── CMakeLists.txt
├── hello
│ ├── hello.c
│ └── hello.h
└── main.c
hello.c 会被编译成动态库文件 libhello.so,而 main.c 会被编译成可执行程序,main.c 源码中调用了 hello.c 提供的函数。
# CMakeLists.txt
cmake_minimum_required("VERSION" "3.5")
project(HELLO VERSION 1.1.0) #设置工程版本号为 1.1.0
# 设置可执行文件和库文件输出路径
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
# 头文件包含
include_directories(hello)
# 动态库目标
add_library(hello SHARED hello/hello.c)
# 可执行程序目标
add_executable(main main.c)
target_link_libraries(main PRIVATE hello) #链接库
进入到build目录下,执行cmake、make进行构建、编译,最终会生成可执行文件main和库文件libhello.so。
执行结果
├── build
│ ├── bin
│ │ └── main
│ ├── lib
│ └── libhello.so
├── CMakeLists.txt
├── hello
│ ├── hello.c
│ └── hello.h
└── main.c
这是因为我们通过设置 EXECUTABLE_OUTPUT_PATH 和 LIBRARY_OUTPUT_PATH 才会使得生成的可执行程序在 build/bin 目录下、生成的库文件在 build/lib 目录下,如果把这两行给注释掉,那么生成的文件在 build 目录中,因为默认情况下,最终的目标文件的输出目录就是源码的 BINARY_DIR。