文章目录
1. CMake简介
CMake是一个跨平台的安装(编译)工具,CMake 可以编译源代码、制作程序库、产生适配器(wrapper)、还可以用任意的顺序建构执行档。
源 | 地址 |
---|---|
CMake官网 | https://cmake.org |
CMake官方帮助文档 | https://cmake.org/cmake/help/book/mastering-cmake/ |
CMake3.7官方教程 | https://www.w3cschool.cn/doc_cmake_3_7/ |
待补充CMake的版本及安装相关内容!!!
2. CMakeLists.txt 框架
2.1 目录结构及框架
目录结构
| -- build
| -- src
| -- CMakeLists.txt
| -- main.cpp
cmakelists.txt框架
##################### 工程配置部分 #####################
cmake_minium_required(VERSION num) #指定CMake的最小版本
project(cur_project_name) #设置工程名称
#这个命令不是强制性的,它会引入两个变量 demo_BINARY_DIR 和 demo_SOURCE_DIR
#同时,cmake 自动定义了两个等价的变量 PROJECT_BINARY_DIR 和 PROJECT_SOURCE_DIR。
set(CMAKE_CXX_FLAGS "xxx") #设置编译器类型,如-std=c+11
set(CMAKE_BUILD_TYPE) #设定编译模式,如DEBUG/RELEASE
##################### 结构框架部分 #####################
add_compile_definitions(COMPILE_DEFINITIONS=64) #添加预处理器定义
add_definations(-D Macro_Definition) #添加宏定义
#添加src目录下的头文件
include_directories(${PROJECT_SOURCE_DIR}/src)
#获取工程下的文件
file(GLOB_RECURSE HEADERS ${PROJECT_SOURCE_DIR}/*.h
${PROJECT_SOURCE_DIR}/src/*.h)
file(GLOB_RECURSE SOURCES ${PROJECT_SOURCE_DIR}/*.cpp
${PROJECT_SOURCE_DIR}/src/*.cpp)
file(GLOB_RECURSE FORMS ${PROJECT_SOURCE_DIR}/*.ui
${PROJECT_SOURCE_DIR}/src/*.ui)
file(GLOB_RECURSE INLS ${PROJECT_SOURCE_DIR}/*.inl
${PROJECT_SOURCE_DIR}/src/*.inl)
#增加子目录模块
add_subdirectory(src/sub_dir1)
add_subdirectory(src/sub_dir2)
##################### 依赖执行部分 #####################
find_package(lib_name VERSION REQUIRED) #引入外部库
add_library(<name> [lib_type] source_name) #生成库类型(动态.so.dll/静态.a)
include_directories(${lib_name_INCLUDE_DIRS})
add_excutable(cur_project_name main.cpp)
target_link_libraries(${lib_name_LIBRARIES})
##################### 其他辅助部分 #####################
function(function_name arg) #定义一个函数
AUX_SOURCE_DIRECTORY(PATH src_list) #查找当前目录所有文件并存储到变量src_list中
FOREACH(one_dir ${src_list})
MESSAGE(${one_dir})
ENDFOREACH(one_dir)
add_compile_options() #添加编译选项
3. CMake Gui的使用
- CMake框架基本应用
4.1 CMake框架 - 构建基本工程
4.2 CMake框架 - 构建结构分层工程
参考文献——都是很不错的文章
附录1 CMake常用方法
cmake设置软件图标
- 生成ico文件,可以直接搜索在线生成ico文件工具,尺寸可以选128x128。
- 编写app.rc.in文件,内容如下
#include <windows.h>
- 按如下目录结构存放文件
| -- build
| -- src
| -- main.cpp
| -- resources
| -- app.ico
| -- app.rc.in
| -- CMakeLists.txt
- CMakeLists.txt中配置图标
# add rc
set(APP_RC_FILE ${CMAKE_CACHEFILE_DIR}/app.rc)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/app.rc.in ${APP_RC_FILE})
file(APPEND ${APP_RC_FILE} "IDI_ICON1 ICON \"resources/app.ico\" ")
- 向 CMake 项目中添加可执行文件
add_executable(${PROJECT_NAME}
${APP_RC_FILE}
src/main.cpp
)
- 编译工程前会报错,应先执行CMake在进行工程构建
附录2 CMake常用语法
常用变量
- CMake布尔值常量
类型 | 值 |
---|---|
true | TRUE,ON,YES, 1,Y,非0的值 |
false | FALSE,NO,OFF,0,N,IGNORE,空字符串,-NOTFOUND结尾的字符串 |
- 环境变量
变量 | 含义 |
---|---|
GLOB_RECURSE | 寻访所有那些匹配目录的子路径并同时匹配查询表达式的文件 |
PROJECT_NAME | 工程名 |
project(cur_project_name) | 这个命令不是强制性的,它会引入两个变量 demo_SOURCE_DIR 和 demo_BINARY_DIR,同时,cmake 自动定义了两个等价的变量 PROJECT_SOURCE_DIR 和 PROJECT_BINARY_DIR 。 |
PROJECT_SOURCE_DIR | 当前工程根目录 |
PROJECT_BINARY_DIR | 运行cmake命令的目录,通常是${PROJECT_SOURCE_DIR}/build |
CMAKE_CURRENT_SOURCE_DIR | 当前处理的CMakeLists.txt所在的路径 |
CMAKE_CURRENT_BINARY_DIR | target编译目录 |
CMAKE_CURRENT_LIST_FILE | 输出调用这个变量的CMakeLists.txt的完整路径 |
CMAKE_CURRENT_LIST_LINE | 输出这个变量所在的行 |
CMAKE_MODULE_PATH | 定义自己的cmake模块所在的路径 |
CMAKE_INSTALL_PREFIX | 构建install的路径 |
$ENV{HOME} | HOME环境下的目录路径 |
package_INCLUDE_DIR | 导入包头文件目录 |
package_LIBRAYIES | 导入库文件的全路径 |
VERSION | cmake版本号 |
在这里插入代码片
常用指令
- Set
set | 作用 |
---|---|
设置变量 | |
set(variable_name value) | |
set(Path ${CMAKE_SOURCE_DIR}) | 引用方式,${变量名} |
设置列表 | |
set(list_name value1 value2 … valuen) | 引用方式,${列表名} |
配置相关 | |
set(CMAKE_CXX_FLAGS "xxx") | 设置编译器类型,如-std=c+11 |
set(CMAKE_BUILD_TYPE) | 设定编译模式,如DEBUG/RELEASE |
测试: 打印变量值 | message("var=${var}") |
- add_definations
环境变量 | 作用 |
---|---|
add_definations(-D Macro_Definition) | 添加宏定义 |
-G | G应该是Generator的意思,该语句可以设置IDE,比如Xcode |
-D | 用来设置编译器宏定义 |
- 功能函数
功能函数 | 作用 |
---|---|
include_directories(PATH) | 添加PATH目录下的头文件 |
file(GLOB_RECURSE name PATH) | 获取工程PATH目录下的文件 |
add_subdirectory(PATH) | 增加子目录模块 |
find_package(lib_name VERSION REQUIRED) | 引入外部库 |
add_library(<name> [lib_type] source_name) add_library(common STATIC util.cpp) # 生成静态库 add_library(common SHARED util.cpp) # 生成动态库或共享库 | 生成库类型(动态.so.dll/静态.a) 在 Linux 下是: demo libcommon.a libcommon.so 在 Windows 下是: demo.exe common.lib common.dll |
link_libraries(${lib_name_LIBRARIES}) | 用在add_executable之前,用来链接静态库 |
target_link_libraries(${lib_name_LIBRARIES}) | 用在add_executable之后,添加可执行文件所需要的库,即按照header file + .lib + .dll方式隐式调用动态库的.lib库 |
AUX_SOURCE_DIRECTORY(PATH src_list) | 查找当前目录所有文件并存储到变量src_list中 |
add_compile_options() | 添加编译选项 |
function(function_name arg) | 定义一个函数,待写示例 |
add_executable(demo demo.cpp) | 生成可执行文件 |
附录3 常用问题解决
CMakeLists.txt 使用*时添加文件时,报错无法识别该规则
错误内容如下
ninja: error: ‘…/…/lib/*.lib’, needed by ‘YourProject.exe’, missing and no known rule to make it
# 错误书写方式
set(LIBRARIES
path/lib/*.lib
)
target_link_libraries(${PROJECT_NAME} PRIVATE ${LIBRARIES})
# 更正后书写方式
file(GLOB TEST_LIB ${LIBRARY_DIR}/lib/*.lib)
set(LIBRARIES
${TEST_LIB}
# your其他lib
# ……
)
target_link_libraries(${PROJECT_NAME} PRIVATE ${LIBRARIES})