CMake编写总结
时间:2022-07-24
本文章向大家介绍CMake编写总结,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
CMake编写总结
- 不定期更新
CMake介绍
- 以下来自百度百科
CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C特性,类似UNIX下的automake。只是 CMake 的组态档取名为 CMakeLists.txt。CMake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C 的 projects/workspaces),然后再依一般的建构方式使用。这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的软件,这种可以使用各平台的原生建构系统的能力是 CMake 和 SCons 等其他类似系统的区别之处。
CMake和make
- 以下来自百度百科
“CMake”这个名字是“cross platform make”的缩写。虽然名字中含有“make”,但是CMake和Unix上常见的“make”系统是分开的,而且更为高阶。
make
和CMake
之间的关系是CMake
通过命令可以生成make
执行的Makefile
文件,所以说CMake
是make
的升级版的生成工具
CMake文档
点击此处到达CMake
的在线文档页面。
各种CMake编写
- 以下收录的是本人自己的各种项目的
CMakeLists.txt
文件,以做参考
CMakeLists.txt一般使用格式
#set minimum compile version
CMake_minimum_required(VERSION 3.14)
#set project name
project(CMaketest)
#set target app name
set(TARGET_NAME test)
...
#genarate a app
add_executable(${TARGET_NAME} 源文件 头文件)
简单C++项目编写CMakeLists.txt
- 简单项目是指只有一个文件夹,并且所有项目文件都放在其中的项目,由于文件结构简单,直接使用一下内容即可将项目进行编译。
ProjectName #项目目录
├── CMakeLists.txt #项目根目录CMakeLists.txt配置文件
├── main.cpp #程序入口
├── ... #其他项目文件
└── test.cpp #其他项目文件
- 在当前项目文件夹新建
CMakeLists.txt
文件,并输入以下内容
#set minimum compile version
CMake_minimum_required(VERSION 3.14)
#set project name
project(CMaketest)
#set target app name
set(TARGET_NAME test)
#use c++ 17 stander
set(CMake_CXX_STANDERD 17)
#set all resources files
file(GLOB SOURCES "*.cpp")
file(GLOB HEADERS "*.h")
#genarate a app
add_executable(${TARGET_NAME} ${SOURCES} ${HEADERS})
- **注意:**简单项目不推荐使用
GLOB_RECURSE
,因为他会遍历所有找到的文件夹以及他的子文件夹,容易造成把build
目录扫描导致main
函数重复定义的情况
完成后用CMake编译生成makefile,即可使用make命令进行项目的编译了
复杂(多文件夹)C++项目写CMakeLists.txt
复杂项目示例
- 一般有较多文件的项目都是使用多文件夹进行管理项目源文件的,使用多个不同级目录下保存源文件的管理方式使用CMake生成makefile可以使用以下管理方式
ProjectName #项目目录
├── CMakeLists.txt #项目根目录CMakeLists.txt配置文件
└── src #源码目录
├──utilities #次级原码目录
| ├── CMakeLists.txt #次级源码目录CMakeLists.txt配置文件
| ├── util.h #其他次级源码
| ├── util.cpp #其他次级源码
| ├── ... #其他次级源码
| └── log.cpp #其他次级源码
| ... #其他次级原码目录
├── CMakeLists.txt #源码目录CMakeLists.txt配置文件
├── main.cpp #程序入口
├── ... #其他项目文件
└── test.cpp #其他项目文件
复杂项目的CMakeLists.txt
CMakeLists.txt #项目根目录CMakeLists.txt配置文件
#set minimum compile version
CMake_minimum_required(VERSION 3.14)
#set project name
project(CMaketest)
#add the src subdirectory
add_subdirectory(src)
CMakeLists.txt #源码目录CMakeLists.txt配置文件
#set minimum CMake compile version
CMake_minimum_required(VERSION 3.14)
#set target app name
set(TARGET_NAME testCMake)
#use c++ 17 stander
set(CMake_CXX_STANDERD 17)
# add a source file subdirectory
add_subdirectory(utilities)
#set all resources files
file(GLOB_RECURSE SOURCES "*.cpp")
file(GLOB_RECURSE HEADERS "*.h")
#genarate a app
add_executable(${TARGET_NAME} ${SOURCES} ${HEADERS})
CMakeLists.txt #次级源码目录CMakeLists.txt配置文件
- 其他次级原码目录CMakeLists.txt配置文件一样
- 可以不配置,因为使用了源码目录的
CMakeLists.txt
使用了GLOB_RECURSE
,正常情况会自动遍历到此文件夹下
#set minimum compile version
CMake_minimum_required(VERSION 3.14)
#set all resources files
file(GLOB_RECURSE SOURCES "*.cpp")
file(GLOB_RECURSE HEADERS "*.h")
- 这样就可以对多个文件夹管理的项目使用CMake生成makefile了
qt项目编写CMake
- qt项目需要添加相应的库,只需要将一些配置项添加在源码目录CMakeLists.txt配置文件即可
#set minimum CMake compile version
CMake_minimum_required(VERSION 3.14)
#set target app name
set(TARGET_NAME testCMake)
#use c++ 17 stander
set(CMake_CXX_STANDERD 17)
set(CMake_CXX_STANDARD_REQUIRED ON)
#include this priject on
set(CMake_INCLUDE_CURRENT_DIR ON)
#auto genarate ui.h file
set(CMake_AUTOUIC ON)
#auto genarete moc file
set(CMake_AUTOMOC ON)
#auto genarate .qrc file on
set(CMake_AUTORCC ON)
# set QT type
set(QT Core Gui Widgets Network DBus Sql)
#add package lib
find_package(Qt5 REQUIRED ${QT})
# add a source file subdirectory
#add_subdirectory(utilities)
#set all resources files
file(GLOB_RECURSE SOURCES "*.cpp")
file(GLOB_RECURSE HEADERS "*.h")
file(GLOB_RECURSE FORMS "*.ui")
file(GLOB_RECURSE RESOURCES "*.qrc")
#genarate a app
add_executable(${TARGET_NAME} ${SOURCES} ${HEADERS} ${FORMS} ${RESOURCES})
#add QT5 dependes
target_link_libraries(${TARGET_NAME} PRIVATE Qt5::Widgets)
使用
在当前文件夹下使用一下命令可以生成Makefile
:
cmake
- 但是,如此生成的话会产生很多中间文件,从而导致了当前文件夹的文件过多,再次编辑文件的时候会很难找到确切的文件的状况,这就是污染项目结构
- 所以,为了不污染项目环境,推荐使用以下命令来生成
Makefile
mkdir build
cd build
cmake ..
- 云数据库安全与农场和餐馆:知道来源的重要性
- 云数据库安全,农场和餐馆:知道你的来源的重要性
- NO.32 不堪重负:线程池拒绝策略
- 工厂模式进阶之Android中工厂模式源码分析
- C加加游戏编程,大神十年的绝技,正确的入门,这才叫学习
- 我们应该担心吗?人工智能现在可以通过交谈来学习新单词!
- 印度财政部:比特币是纯粹投机行为 区块链资产是“庞氏骗局”
- 法律人工智能实验室成立,法官和律师会丢饭碗吗?
- 让GridView中CheckBox列支持FireFox
- 在ASP.NET MVC中通过URL路由实现对多语言的支持
- AI加持下的假肢将会越来越聪明
- 通过几个Hello World感受.NET Core全新的开发体验
- ASP.NET MVC三个重要的描述对象:ControllerDescriptor
- 基于自制数据集的MobileNet-SSD模型训练
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法