CMake是一个项目构建工具,并且是跨平台的,Makefile(通过 make 命令进行项目的构建),大多是IDE软件都集成了make,比如:VS 的 nmake、linux 下的 GNU make,makefile 通常依赖于当前的编译平台,而且编写 makefile 的工作量比较大,解决依赖关系时也容易出错。CMake的优点:
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/build/sort", //1. 可执行文件的绝对路径,需要随着调试文件的变化而变化
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}/build/", //2.路径,也需要写好
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "Set Disassembly Flavor to Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
],
"preLaunchTask": "Build", //前置操作,会往task.json中寻找Build操作
"miDebuggerPath": "/usr/bin/gdb" //gdb,默认的,如果需要修改,需要自己改动
}
]
}
{
"version": "2.0.0",
"options": {
"cwd": "${fileDirname}/build/" //3.路径,也需要配置好,和2配置的一样
},
"tasks": [
{
"label": "cmake",
"type": "shell",
"command": "cmake",
"args": [
".."
]
},
{
"label": "make",
"group":{
"kind":"build",
"isDefault":true
},
"command": "make",
"args":[
]
},
{
"label":"Build", //Build操作
"dependsOn":[ //会先后执行cmake和make
"cmake",
"make"
]
}
]
}
两个重要的宏定义:
cmake_minimum_required(VERSION 3.0) #指定使用的 cmake 的最低版本
project(SortMake) # 设置项目名称,参数可以随意指定
include_directories(include)# 设置包含的头文件目录
aux_source_directory(src SRC_SUB) # 搜索 src 目录下所有的源文件,并将结果列表存储在变量 SRC_SUB 中
aux_source_directory(. SRC_CUR) # 搜索 当前 目录下所有的源文件,并将结果列表存储在变量 SRC_CUR 中
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
set(CMAKE_CXX_STANDARD 14) #设置CMAKE编译版本为14
set(CMAKE_BUILD_TYPE Debug) # debug版本
add_library(calc STATIC ${SRC_SUB}) # calc是静态库的名字,STATIC是关键字,不可变更。${SRC_SUB}是需要制作静态库的文件夹
# 最终会将src文件夹下的文件生成静态库文件libcalc.a
add_library(calcs SHARED ${SRC_SUB}) # calcs是动态库的名字,SHARED是关键字,不可变更。${SRC_SUB}是需要制作动态库的文件夹
# 最终会将src文件夹下的文件生成静态库文件libcalcs.so
# 设置动态库/静态库生成路径
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
add_executable(sort ${SRC_SUB} ${SRC_CUR}) # 指定使用源文件${SRC_SUB} ${SRC_CUR},生成可执行文件sort
target_compile_features(sort PRIVATE cxx_std_14) #也可以用target_compile_features命令用于指定目标sort需要私有编译特性cxx_std_14,它将确保编译器使用C++14标准。
创建build文件夹,切换到build,shell执行cmake .. 命令,会生成makefile文件,此时再执行make命令,就可以对项目进行构建得到所需的可执行程序了。
静态库会在生成可执行程序的链接阶段被打包到可执行程序中,所以可执行程序启动,静态库就被加载到内存中了。
动态库在生成可执行程序的链接阶段不会被打包到可执行程序中,当可执行程序被启动并且调用了动态库中的函数的时候,动态库才会被加载到内存。
# 指定需要链接的库的路径,lib库中包含静态库文件和动态库文件
link_directories(${PROJECT_SOURCE_DIR}/lib)
# 链接静态库
link_libraries(calc)
add_executable(sort ${SRC_SUB} ${SRC_CUR}) # 指定使用源文件${SRC_SUB} ${SRC_CUR},生成可执行文件sort
target_compile_features(sort PRIVATE cxx_std_14) #也可以用target_compile_features命令用于指定目标sort需要私有编译特性cxx_std_14,它将确保编译器使用C++14标准。
# 指定可执行程序要链接的动态库,这里的写法是sort链接的时候,需要链接线程库pthread和第三方库calcs
target_link_libraries(sort pthread calcs)
嵌套的 CMake 也是一个树状结构,最顶层的 CMakeLists.txt 是根节点,其次都是子节点。
cmake_minimum_required(VERSION 3.0)
project(test)
# 定义变量
# 静态库生成的路径
set(LIB_PATH ${CMAKE_CURRENT_SOURCE_DIR}/lib)
# 测试程序生成的路径
set(EXEC_PATH ${CMAKE_CURRENT_SOURCE_DIR}/bin)
# 头文件目录
set(HEAD_PATH ${CMAKE_CURRENT_SOURCE_DIR}/include)
set(CMAKE_BUILD_TYPE Debug) # debug版本
# 静态库的名字
set(CALC_LIB calc)
set(SORT_LIB sort)
# 可执行程序的名字
set(APP_NAME_1 test1)
set(APP_NAME_2 test2)
# 添加子目录
add_subdirectory(calc)
add_subdirectory(sort)
add_subdirectory(test1)
add_subdirectory(test2)
参考列表
https://www.bilibili.com/video/BV1fy4y1b7TC/
https://subingwen.cn/cmake/CMake-primer/