CMake
CMake是一个跨平台的自动化构建系统。它本身不是编译器,而是一个“生成构建文件的工具”。
简单来说:
CMake读取写的文件配置(CMakeList.txt)。根据当前的操作系统、编译器,生成合适的构建文件。
例如:
- Linux生成Makefile
- window生成Visual Studio 工程文件
- macOs生成Xcode文件
然后可以用这些文件去编译项目。
1、CMake的构建流程
| CMakeList.txt | 配置文件(跨平台可移植,任何平台都能读取) |
| CMake | 读取CMakeList.txt |
|
生成平台相关构建文件 -Linux:Makefile -Window:.lsn -macOs:Xcode工程 | |
|
调用对应的构建工具 -make(Linux) -MSBuild(Window) -xcodebuild(macOS) | |
|
编译器/链接器 (g++,clang++) | |
| 可执行文件/库 |
1.1、CMake、Makefile、make的区别
编译一个C++程序,假设好像是盖房子
他根据你设计需求(CMakeList.txt),生成一个详细的施工图纸(Makefile)
上面写的比较清楚:哪些源文件要准备,哪一步编译,哪一步链接
工头不自己搬砖,他只是读Makefile,然后安排工人(编译器)一步步完成施工
真正干活的人,把源码翻译为机器码。 |
1.2、如何用CMake生成静态库和动态库
用户CMake生成静态库和动态库只需使用add_library,并指定STATIC或SHARED关键字
# 生成静态库
add_library(mylib_static STATIC mylib.cpp)
# 生成动态库
add_library(mylib_shared SHARED mylib.cpp)
静态库后缀:lib+库名字+.a
动态库后缀:.so 。有可执行权限
1.3、CMake构成
顶层 :指定版本、项目名称、添加子目录
cmake_minimum_required(VERSION 3.10)
project(MyProject)
# 添加子目录
add_subdirectory(lib)
add_subdirectory(app)
核心
# window上自动导出DLL符号
set(CMAKE_WINDOW_EXPORT_ALL_SYMBOLS ON)
#生成静态库
add_library(mylib_static STATIC mylib.cpp)
# 生成动态库
add_library(mylib_shared SHARED mylib.cpp)
add_executable :定义生成一个可执行程序。
add_executable(可执行程序名 源文件名称)
这里执行程序名与project中的项目名没有任何关系
源文件名可以是多个,多个用空格或者;间隔
定义变量
set(SRC_LIST add.c;div.c;sun.c)
add_executable(app ${SRC_LIST})
指定C++标准
# 在CMake中通过set指定
# 增加-std=C++11
set(CMAKE_CXX_STANDARD 11)
指定输出的路径
# 定义一个变量存储绝对路径
set(HOME /home/linux/sort)
# 定义一个路径设置为EXECUTABLE_OUTPUT_PATH 的宏
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin)
1.4、搜索文件
方式1:使用aux_sourse_directory 命令可以查找路径下的所有源文件
aux_sourse_directory(<dir> <variable>)
dir 要搜索的目录;variable从dir中搜索到的源文件存储在变量中。
方式2:file命令
file(GLOB/GLOB_RECURSE 变量名 要搜索的文件路径和文件类型)
GLOB指定目录下搜索满足条件的所有文件名生成一个列表,并将其存储在变量中。
GLOB_RECURSE:递归搜索指定目录。
1.5、头文件
指定头文件路径目录
include_directories(${}/include)
1.6、链接库文件
link_libraries(<static lib> [<static lib> ...]
link_libraries(calc)
# 指定自定义静态库路径
link_directories(${}/lib1)
1.7、链接动态库
target_link_libraries()
动态库链接是具有传递性的,动态库的访问权限是public,只能传递一次
1.8、日志
message([STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR] "message to dispaly" ...)
[STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR]:是消息级别
1.9、字符串操作
拼接:
set(变量名 ${变量名1} ${变量名2})
多个变量合为一个。
1.10、list
1、获取字符串长度:list(LENGTH <list> <output variable>)
具体详细操作以后再实践中学习。细节不在详细描述了。
1765

被折叠的 条评论
为什么被折叠?



