CMake 构建系统重点内容


1 基本语法与结构

cmake_minimum_required()

指定使用的最低 CMake 版本,防止不同版本行为不一致:

cmake_minimum_required(VERSION 3.16)

project()

定义项目名称、语言和版本:

project(MyApp VERSION 1.0 LANGUAGES C CXX)

add_executable()

添加一个可执行文件目标:

add_executable(myapp main.cpp)

add_library()

添加一个静态或动态库:

add_library(mylib STATIC lib.cpp)
# 或
add_library(mylib SHARED lib.cpp)

target_include_directories()

指定目标使用的头文件搜索路径:

target_include_directories(myappPRIVATE ${CMAKE_SOURCE_DIR}/include
)
  • PRIVATE: 仅本目标使用
  • PUBLIC: 本目标及依赖它的目标都使用
  • INTERFACE: 只导出给依赖者,不用于本身

target_link_libraries()

链接库或其他目标:

target_link_libraries(myappPRIVATE mylibPRIVATE pthread
)

target_compile_options()

添加编译选项:

target_compile_options(myapp PRIVATE -Wall -O2)

target_compile_definitions()

添加宏定义(等价于 -D):

target_compile_definitions(myapp PRIVATE VERSION="1.0")

2 构建类型(Build Type)

通过 CMAKE_BUILD_TYPE 控制不同构建模式:

cmake -DCMAKE_BUILD_TYPE=Release ..
构建类型描述
Debug含调试信息,关闭优化,默认编译 -g
Release启用优化 -O3,无调试信息
RelWithDebInfo含调试信息 + 优化(适合性能调试)
MinSizeRel最小二进制文件(嵌入式)

3 编译器检测与选项控制

CMake 可检测编译器与平台差异,并根据平台设置不同选项:

if(CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU")target_compile_options(myapp PRIVATE -Wall -Wextra)
endif()if (MSVC)target_compile_options(myapp PRIVATE /W4)
endif()

4 子模块与子项目支持

add_subdirectory()

添加子模块项目:

add_subdirectory(thirdparty/mylib)
target_link_libraries(myapp PRIVATE mylib)
  • 要求子目录下有 CMakeLists.txt

FetchContent(现代推荐)

自动下载第三方依赖并引入构建流程:

include(FetchContent)
FetchContent_Declare(jsonGIT_REPOSITORY https://github.com/nlohmann/json.gitGIT_TAG v3.11.2
)
FetchContent_MakeAvailable(json)
target_link_libraries(myapp PRIVATE nlohmann_json::nlohmann_json)

适合构建阶段临时获取依赖而不污染系统环境。


5 外部项目支持:ExternalProject_Add

用于构建不能直接作为子目录添加的外部项目(适用于非 CMake 项目):

include(ExternalProject)
ExternalProject_Add(extlibURL https://example.com/extlib.tar.gzCONFIGURE_COMMAND ./configureBUILD_COMMAND makeINSTALL_COMMAND make install
)

可用于引入 Autotools / Makefile 项目。


6 安装与导出

install()

设置安装路径规则:

install(TARGETS myapp DESTINATION bin)
install(FILES include/mylib.h DESTINATION include)

安装到 CMAKE_INSTALL_PREFIX,默认是 /usr/local

执行安装命令:

cmake --install build

export() 与配置导出

为了支持 目标被其他 CMake 项目 find_package 使用,需要导出配置:

install(TARGETS mylib EXPORT mylibTargets DESTINATION lib)
install(EXPORT mylibTargetsFILE mylibTargets.cmakeNAMESPACE mylib::DESTINATION lib/cmake/mylib
)

配合生成配置文件 mylibConfig.cmake

include(CMakePackageConfigHelpers)
write_basic_package_version_file("${CMAKE_CURRENT_BINARY_DIR}/mylibConfigVersion.cmake"VERSION 1.0COMPATIBILITY SameMajorVersion
)
install(FILES"${CMAKE_CURRENT_SOURCE_DIR}/mylibConfig.cmake""${CMAKE_CURRENT_BINARY_DIR}/mylibConfigVersion.cmake"DESTINATION lib/cmake/mylib
)

这样就能在其他项目中使用:

find_package(mylib REQUIRED)
target_link_libraries(app PRIVATE mylib::mylib)

总结

CMake 总体结构
├── 项目定义与语法
│   ├── cmake_minimum_required()
│   ├── project()
│   ├── add_executable / add_library
│   ├── target_* APIs
├── 构建类型与选项
│   ├── CMAKE_BUILD_TYPE
│   ├── target_compile_options / definitions
├── 多模块与依赖
│   ├── add_subdirectory
│   ├── FetchContent_Declare
│   └── ExternalProject_Add
├── 安装与包导出
│   ├── install()
│   ├── export()
│   └── CMakePackageConfigHelpers

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/84865.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/84865.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/84865.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Packagerun:VSCode 扩展 快捷执行命令

Packagerun:VSCode 快捷命令扩展(兼容cursor) Packagerun 是一个为 前端和node开发者设计的 VSCode 扩展,旨在简化 package.json 中脚本的执行,并支持自定义命令以提升开发效率。通过右键菜单、快捷键或自定义配置&am…

【C语言】计算机组成、计算机语言介绍

1.1 计算机组成 1946年2月14日,由美国军方定制的世界上第一台电子计算机“电子数字积分计算机”( ENIAC Electronic Numerical And Calculator)在美国宾夕法尼亚大学问世。 计算机(俗称电脑)堪称是人类智慧的结晶,随着计算机的不断发展,各行各…

(九)山东大学软件学院项目实训-基于大模型的模拟面试系统-面试对话标题自动总结

面试对话标题自动总结 主要实现思路:每当AI回复用户之后,调用方法查看当前对话是否大于三条,如果大于则将用户的两条和AI回复的一条对话传给DeepSeek让其进行总结(后端),总结后调用updateChatTopic进行更新…

降阶法求解偏微分方程

求解给定的四个偏微分方程,采用降阶法,令 v = u x v = u_x v=ux​,从而将原方程转化为关于 v v v 的一阶方程。 方程 u x y = 0 u_{xy} = 0 uxy​=0 令 v = u x v = u_x v=ux​,则方程变为 v y = 0 v_y = 0 vy​=0。解得 v = C 1 ( x ) v = C_1(x) v=C1​(x),即 u …

提的缺陷开发不改,测试该怎么办?

经历长时间的细致检查,逐条执行数十条测试用例,终于发现一处疑似缺陷。截图留存、粘贴日志,认真整理好各项信息,将它提交到缺陷管理系统。可不到五分钟,这条缺陷就被打回了。开发人员给出的回复十分简洁:“…

【Flutter】Widget、Element和Render的关系-Flutter三棵树

【Flutter】Widget、Element和Render的关系-Flutter三棵树 一、前言 在 Flutter 中,所谓的“三棵树”是指: Widget Tree(部件树)Element Tree(元素树)Render Tree(渲染树) 它们是…

IO之详解cin(c++IO关键理解)

目录 cin原理介绍 控制符(hex、oct、dec) cin如何检查输入 cin与字符串 cin.get(char ch) cin.get(void) istream &get(char*,int) istream &get(char*,int,char) istream &getline(char*,int); 遇到文件结尾EOF 无法完成一次完整输入:设置f…

Bootstrap 5学习教程,从入门到精通, Bootstrap 5 分页(Pagination)知识点及案例代码(13)

Bootstrap 5 分页(Pagination)知识点及案例代码 Bootstrap 5 提供了强大的分页组件,帮助开发者轻松实现分页功能。以下是关于 Bootstrap 5 分页的详细语法知识点以及一个完整的案例代码,包含详细注释,帮助初学者快速上…

Dina靶机渗透

1.信息查询 1.1. Ip查询 arp-scan -l 192.168.220.137 1.2. 端口收集 nmap -T4 -A -p- 192.168.220.137 1.3. 目录扫描 dirsearch -u 192.168.220.137 -e* -i 200 通过访问 robots.txt 文件发现有些禁止访问得目录 User-agent: *Disallow: /ange1Disallow: /angel1Dis…

通俗理解存储过程注入

【通俗理解】存储过程注入:SQL注入的“豪华升级版” 一、从厨房做菜说起:为什么需要存储过程? 想象你经营一家连锁餐厅,每道菜的制作流程非常复杂(比如“招牌红烧肉”需要先焯水、再炒糖色、最后慢炖1小时&#xff09…

【算法】基于中位数和MAD鲁棒平均值计算算法

问题 在项目中,需要对异常值进行剔除,需要一种鲁棒性比较好的方法,总结了一个实践方法。 方法 基于中位数和MAD(中位数绝对偏差)的鲁棒平均值计算算法的详细过程,按照您要求的步骤分解: 算法…

插入点(position) 和对齐点(AlignmentPoint)详解——CAD c#二次开发

在 AutoCAD 中,文本对象的位置由插入点(position) 和对齐点(Alignment Point) 共同控制,两者的关系取决于文本的对齐方式。以下是详细说明: 一、插入点与对齐点的定义 1. 插入点(p…

QT打包应用

本次工程使用qt mingGw 64-bit 下面详细介绍下windows平台qt应用程序打包流程 1、先编译项目的release版本生成exe文件 2、创建脚本运行windeployqt.exe完成打包 rundeploy.bat脚本 set PATHE:\Tools\qt\Qt5\5.14.2\mingw73_64\bin;%PATH% windeployqt.exe MyDesignWidget.ex…

[软件测试]:什么是自动化测试?selenium+webdriver-manager的安装,实现你的第一个脚本

目录 1. 什么是自动化测试? 回归测试 自动化分类 2. web自动化测试 3. selenium 1. 什么是自动化测试? 通过自动化测试工具,编写脚本,自动执行测试用例,主要用于回归测试,性能测试等重复测试任务 常…

使用OpenCV和Python进行图像掩膜与直方图分析

文章目录 引言1. 准备工作2. 加载并显示原始图像3. 创建掩膜3. 应用掩膜5. 计算并显示直方图6. 结果分析7. 总结 引言 在图像处理中,掩膜(Mask)是一个非常重要的概念,它允许我们选择性地处理图像的特定区域。今天,我将通过一个实际的例子来展…

Genio 1200 Evaluation MT8395平台安装ubuntu

官网教程: Getting Started with Genio 1200 Evaluation Kit — Ubuntu on Genio documentation Windows PC工具: Setup Tool Environment (Windows) — IoT Yocto documentation 镜像下载地址: Install Ubuntu on MediaTek Genio | Ubu…

如何画好架构图:架构思维的三大底层逻辑

👉目录 0 前言 1 宏观 2 中观 3 微观 4 补充 俗话说,一图胜千言。日常工作中,当我们要表达自己的设计思路的时候,会画各式各样的图。但因为各自知识储备的差异,思维的差异,不同类型的系统侧重的架构设计点也…

Spring MVC扩展消息转换器-->格式化时间信息

Spring MVC 的消息转换器的作用:在 HTTP 请求/响应与 Java 对象之间进行转换 可以自行扩展消息转换器 一、创建对象映射规则 package com.sky.json;import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.Objec…

Elasticsearch 的自动补全以及RestAPI的使用

Elasticsearch 提供了强大的自动补全 (Autocomplete) 功能,以下为一个基础的自动补全DSL语句 {"suggest": {"my_suggestion": { // 自定义建议器名称,可按需修改"text": "ap", // 用户输入的前缀(如搜索框…

1.4、SDH网状拓扑

链形网星形网树形网环形网网孔形网 1.链形拓扑 结构: 节点像链条一样首尾依次串联连接。信号从一个节点传到下一个节点,直至终点。 特点: 简单经济: 结构最简单,成本最低,适用于沿线覆盖(如铁…