CMake的入门使用
- 一 CMake概述
- 优点
- 二 CMake使用
- 注释
- 常用CMake函数
- 常用宏
一 CMake概述
CMake 可以编译源代码、制作程序库、产生适配器(wrapper)、还可以用任意的顺序建构执行档。CMake 支持 in-place 建构(二进档和源代码在同一个目录树中)和 out-of-place 建构(二进档在别的目录里),因此可以很容易从同一个源代码目录树中建构出多个二进档。CMake 也支持静态与动态程式库的建构。
优点
跨平台,可管理大型项目
简化编译结构和编译过程,高效率
二 CMake使用
CMakeLists.txt文件。
注释
# 注释行
#[[
注释块
]]
常用CMake函数
cmake_minimum_required(VERSION 3.0):指定使用的 cmake 的最低版本
project(pro):定义工程名称,并可指定工程的版本、工程描述、web主页地址、支持的语言(默认情况支持所有语言),如果不需要这些都是可以忽略的,只需要指定出工程名字即可。
add_executable(可执行程序名 源文件名称)
- 定义变量
# SET 指令的语法是:
# [] 中的参数为可选项, 如不需要可以不写
SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])# 1: 各个源文件之间使用空格间隔
# set(SRC_LIST c/c++文件 c/c++文件 c/c++文件 c/c++文件)# 2: 各个源文件之间使用分号 ; 间隔
set(SRC_LIST c/c++文件;c/c++文件;c/c++文件;c/c++文件)
add_executable(app ${SRC_LIST})
- 增加C++11
set(CMAKE_CXX_STANDARD 11)
- 输出路径
set(HOME /自己文件所在的位置)
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin)
- 搜索文件aux_source_directory
cmake_minimum_required(VERSION 2.0)
project(pro)
# 搜索头文件
include_directories(${PROJECT_SOURCE_DIR}/include)
# 搜索 src 目录下的源文件
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src SRC_LIST)
# 生成可执行文件
add_executable(app ${SRC_LIST})
- 搜索文件file
cmake_minimum_required(VERSION 2.0)
project(pro)
set(CMAKE_CXX_STANDARD 11)
set(HOME /自己文件所在的位置)
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin/)
include_directories(${PROJECT_SOURCE_DIR}/include)
# 搜索 src 目录下的源文件
file(pro SRC_LIST ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
add_executable(app ${SRC_LIST})
${CMAKE_CURRENT_SOURCE_DIR}
此变量指当前处理的“CMakeLists.txt”文件所在的目录。当CMake处理项目中不同目录中的每个“CMakeLists.txt”文件时,它会发生变化。
CMAKE_CURRENT_SOURCE_DIR是动态的,反映了当前CMAKE上下文的目录。
${PROJECT_SOURCE_DIR}
此变量指的是当前为其配置CMake的项目的根目录。它被设置为顶级“CMakeLists.txt”文件所在的目录。
“PROJECT_SOURCE_DIR”由CMake根据项目配置自动定义。
- 制作动态库或静态库
- 静态库
- add_library(库名称 STATIC 源文件1 [源文件2] …)
- 动态库
- add_library(库名称 SHARED 源文件1 [源文件2] …)
- 静态库
设置动态库生成路径
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
使用LIBRARY_OUTPUT_PATH,这个宏对应静态库文件和动态库文件都适用。
设置动态库/静态库生成路径
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
- 链接库
link_libraries( […])
包含静态库路径
link_directories(${PROJECT_SOURCE_DIR}/lib)
链接静态库
link_libraries(libxxx.a)
链接动态库
target_link_libraries(可执行文件 pthread)
cmake_minimum_required(VERSION 2.0)
project(TEST)
file(项目名字 SRC_LIST ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
# 指定源文件或者动态库对应的头文件路径
include_directories(${PROJECT_SOURCE_DIR}/include)
# 指定要链接的动态库的路径
link_directories(${PROJECT_SOURCE_DIR}/lib)
# 添加并生成一个可执行程序
add_executable(可执行文件 ${SRC_LIST})
# 指定要链接的动态库
target_link_libraries(可执行文件 pthread calc)
- 日志
在CMake中可以用用户显示一条消息,该命令的名字为message
message([STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR] “message to display” …)
(无) :重要消息
STATUS :非重要消息
WARNING:CMake 警告, 会继续执行
AUTHOR_WARNING:CMake 警告 (dev), 会继续执行
SEND_ERROR:CMake 错误, 继续执行,但是会跳过生成的步骤
FATAL_ERROR:CMake 错误, 终止所有处理过程
add_subdirectory
add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
source_dir:指定了CMakeLists.txt源文件和代码文件的位置,其实就是指定子目录
binary_dir:指定了输出文件的路径,一般不需要指定,忽略即可。
EXCLUDE_FROM_ALL:在子路径下的目标默认不会被包含到父路径的ALL目标里,并且也会被排除在IDE工程文件之外。用户必须显式构建在子路径下的目标。
通过这种方式CMakeLists.txt文件之间的父子关系就被构建出来了。
使用
# cmake 命令原型
cmake CMakeLists.txt文件所在路径
常用宏
宏 | 功能 |
---|---|
PROJECT_SOURCE_DIR | 使用cmake命令后紧跟的目录,一般是工程的根目录 |
PROJECT_BINARY_DIR | 执行cmake命令的目录 |
CMAKE_CURRENT_SOURCE_DIR | 当前处理的CMakeLists.txt所在的路径 |
CMAKE_CURRENT_BINARY_DIR | target 编译目录 |
EXECUTABLE_OUTPUT_PATH | 重新定义目标二进制可执行文件的存放位置 |
LIBRARY_OUTPUT_PATH | 重新定义目标链接库文件的存放位置 |
PROJECT_NAME | 返回通过PROJECT指令定义的项目名称 |
CMAKE_BINARY_DIR | 项目实际构建路径,假设在build目录进行的构建,那么得到的就是这个目录的路径 |