认识CMake并使用CMake构建自己的第一个项目

1.CMake的作用和优势

跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用
简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本
自动化构建:CMake能够自动检测系统上的库和工具,减少手动配置的工作量
灵活性:支持多种构建类型和配置(如Debug、Release),并允许用户自定义构建选项和模块
构建配置
CMakeLists.txt文件:CMake的配置文件,用于定义项目的构建规则、依赖关系、编译选项等。每个CMake项目通常包含一个或多个CMakeLists.txt文件
构建目录:为了保持源代码的整洁,CMake鼓励使用独立的构建目录(Out-of-source构建)。这样,构建生成的文件与源代码分开存放。
基本工作流程
  1. 编写 CMakeLists.txt 文件: 定义项目的构建规则和依赖关系。
  2. 生成构建文件: 使用 CMake 生成适合当前平台的构建系统文件(例如 Makefile、Visual Studio 工程文件)。
  3. 执行构建: 使用生成的构建系统文件来编译项目。

2.CMake基础

1.指定CMake的最低版本要求

cmake_minimum_required(VERSION <version>)
cmake_minimum_required(VERSION 3.10)

2.定义项目的名称和使用的编程语言

project(<project_name>[<language>...])
project(MyProject CXX)

3.指定要生成的可执行文件和其他源文件

add_executable(<target> <source_file>...)
add_executable(MyExecutable main.cpp other_file.cpp)

4.创建一个库(静态库或者动态库)及其源文件

add_library(<target> <source_file>...)
add_library(MyLibrary STATIC library.cpp)

5.链接目标文件与其他库

target_link_libraries(<target> <libraries>...)
target_link_libraries(MyExecutable MyLibrary)

6.添加头文件搜索路径

include_directories(<dirs>...)
include_directories(${PROJECT_SOURCE_DIR}/include)

简单的CMakeLists.txt文件实例

cmake_minimum_required(VERSION 3.10)
project(MyProject CXX)# 添加源文件
add_executable(MyExecutable main.cpp)# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 11)

查找库和包

        CMake可以通过find_package()指令自动检测和配置外部库和包

        常用于查找系统安装的库和第三方库

find_package()指令

基本用法:

find_package(Boost REQUIRED)

指定版本:

find_package(Boost 1.70 REQUIRED)

查找库并指定路径:

find_package(OpenCV REQUIRED PATHS /path/to/opencv)

使用查找的库:

target_link_libraries(MyExecutable Boost::Boost)

设置包含目录和链接目录:

include_directories(${Boost_INCLUDE_DIRS})
link_directories(${Boost_LIBRARY_DIRS})

实例

cmake_minimum_required(VERSION 3.10)
project(MyProject CXX)# 查找 Boost 库
find_package(Boost REQUIRED)# 添加源文件
add_executable(MyExecutable main.cpp)# 链接 Boost 库
target_link_libraries(MyExecutable Boost::Boost)

3.CMake构建流程

CMake的构建流程分为以下几个主要步骤,从设置项目到生成和执行构建命令

1.创建构建目录:保持源代码目录整洁

2.使用CMake生成构建文件:配置项目并生成适合平台的构建文件

3.编译和构建:使用生成的构建文件执行编译和构建

4.清理构建文件:删除中间文件和目标文件

5.重新配置和构建:处理项目设置的更改

详细的构建流程说明

1.创建构建目录

CMake推荐使用“Out-of-source”构建模式,即 将构建文件放在源代码目录之外的独立目录中。这样可以保持源代码的整洁,并方便管理不同的构建配置。

        创建构建目录:在项目的根目录下,创建一个新的构建目录。例如,可以创建一个名为build的目录

mkdir build

        进入构建目录:进入刚刚创建的目录

cd build

2.使用CMake生成构建文件

        在构建目录中运行CMake,以生成适合当前平台的构建系统文件(例如makefile、Ninja构建文件、Visual Studio工程文件等)

        运行CMake配置:在构建目录中运行CMake命令,指定源代码目录(指包含CMakeLists.txt文件的目录)。

cmake ..

3.构建和编译

        使用生成的构建文件进行编译和构建。

        不同的构建系统使用不同的命令。

        使用 Makefile(或类似构建系统):如果使用 Makefile,可以运行 make 命令来编译和构建项目。

        如果要构建特定的目标,可以指定目标名称。例如:make MyExecutable

4.清理构建文件

        构建过程中生成的中间文件和目标文件可以通过清理操作删除

        使用makefile:运行make clean命令来删除生成的文件

        使用Ninja:运行ninja clean命令来删除生成的文件

        手动删除:rm -rf ./build/*

5.重新配置和构建

        如果修改了CMakeLists.txt文件或项目设置,可能需要重新配置和构建项目

        重新运行CMake配置:在构建目录中重新运行CMake配置命令

cmake ..

        重新编译:使用构建命令重新编译项目        

make

4.构建实例

        假设项目结构如下

1.创建CMakeLists.txt文件

        在 MyProject 目录下创建 CMakeLists.txt 文件。

        CMakeLists.txt 文件用于配置 CMake 项目。

        CMakeLists.txt 文件内容:

cmake_minimum_required(VERSION 3.10)   # 指定最低 CMake 版本project(MyProject VERSION 1.0)          # 定义项目名称和版本# 设置 C++ 标准为 C++11
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)# 添加头文件搜索路径
include_directories(${PROJECT_SOURCE_DIR}/include)# 添加源文件
add_library(MyLib src/mylib.cpp)        # 创建一个库目标 MyLib
add_executable(MyExecutable src/main.cpp)  # 创建一个可执行文件目标 MyExecutable# 链接库到可执行文件
target_link_libraries(MyExecutable MyLib)

说明:

        cmake_minimum_required(VERSION 3.10):指定 CMake 的最低版本为 3.10。

        project(MyProject VERSION 1.0):定义项目名称为 MyProject,版本为 1.0。

        set(CMAKE_CXX_STANDARD 11):指定 C++ 标准为 C++11。

        include_directories(${PROJECT_SOURCE_DIR}/include):指定头文件目录。

        add_library(MyLib src/mylib.cpp):创建一个名为 MyLib 的库,源文件是 mylib.cpp。

        add_executable(MyExecutable src/main.cpp):创建一个名为 MyExecutable 的可执行文件,源文件是 main.cpp。

        target_link_libraries(MyExecutable MyLib):将 MyLib 库链接到 MyExecutable 可执行文件。

2.创建构建目录

        打开终端,进入MyProject目录,然后创建构建目录:

mkdir build
cd build

3.配置项目

        在构建目录中使用CMake配置项目

        这将生成适合平台的构建系统文件

cmake ..

        cmake ..:.. 指向源代码目录,即包含 CMakeLists.txt 文件的目录。CMake 将读取 CMakeLists.txt 文件并生成构建系统文件。

4.编译项目

        使用生成的构建系统文件编译项目。根据生成的构建系统文件类型,使用相应的构建命令。

make

 

5.运行可执行文件

        编译完成之后,可以运行生成的可执行文件

./MyExecutable

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

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

相关文章

Neo4j批量数据导入完全指南:高效处理大规模数据

Neo4j批量数据导入完全指南&#xff1a;高效处理大规模数据 Neo4j作为领先的图数据库&#xff0c;在处理大规模数据导入时需要特别的技术和方法。本文将全面介绍Neo4j批量导入数据的各种技术方案&#xff0c;帮助您选择最适合业务场景的导入方式。 一、Neo4j批量导入的应用场…

Acrobat 首选项配置:从注册表到锁定机制

管理员通常通过首选项和属性在部署前配置安装程序&#xff0c;使受控机器共享必要设置。Acrobat和Reader共享通用首选项集且配置方式相似。由于每台机器的用户界面配置不可扩展&#xff0c;Adobe提供两大配置资源&#xff1a; 需知事项&#xff1a; 文档示例多使用Windows注册…

零基础设计模式——行为型模式 - 中介者模式

第四部分&#xff1a;行为型模式 - 中介者模式 (Mediator Pattern) 接下来&#xff0c;我们学习中介者模式。这个模式用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显式地相互引用&#xff0c;从而使其耦合松散&#xff0c;而且可以独立地改变它们之间的交互…

Day01_C数据结构

01.数据结构 02.段错误出现的四种场景 02.实现顺序表的头插、尾插、头删、尾删(释放顺序表) main.c #include "seq.h" int main(){ seq_p Screate_seqlist(); inputall(S); insert_head(S); dele…

触觉智能RK3576核心板,工业应用之4K超高清HDMI IN视频输入

在工业自动化、医疗影像、轨道交通、电力调度等行业&#xff0c;对高质量视觉信号的实时捕捉和分析需求日益提高。传统工业相机的低分辨率采集模糊了关键细节&#xff0c;延迟的处理过程导致生产环节无法形成闭环控制&#xff0c;让不同硬件之间的协作障碍重重。 触觉智能RK35…

清新文艺手绘学习教育培训竞标汇报PPT模版分享

简约手绘花朵PPT模版&#xff0c;读书学习教育培训学习总结设计PPT模版&#xff0c;商业竞标企业创业总结汇报演讲报告PPT模版&#xff0c;创意动物卡通PPT汇报模版&#xff0c;学术报告PPT模版 清新文艺手绘学习教育培训竞标汇报PPT模版分享

【搜狗输入法】如何使用自定义标点设置来输出直角引号

【搜狗输入法】如何使用自定义标点设置来输出直角引号 前言&#xff1a; 起因是&#xff0c;我在学习Markdown的语法规范的时候 需要用到直角引号「」 但是键盘没法直接打出来&#xff0c;就想用搜狗输入法的自定义标点 结果发现这功能完全是个鸡肋&#xff0c;没法用 一…

HarmonyOS5 运动健康app(二):健康跑步(附代码)

一、数据模型&#xff1a;构建运动记录的数字骨架 代码通过RunRecord接口定义了跑步数据的核心结构&#xff1a; interface RunRecord {id: string; // 记录唯一标识date: Date; // 跑步日期distance: number; // 距离&#xff08;公里&#xff09;duratio…

29-Oracle 23ai Flashback Log Placement(闪回日志灵活配置)

小伙伴们有没有被各种存储路径满导致的业务崩&#xff0c;半夜起来清理的经历。一不小心 FRA写满了&#xff0c;导致了实例hang住。 OCM考试&#xff0c;时不时就会冒出来这个直接给instance hang&#xff0c;本就卡的环境中脑袋都卡壳、无从下手&#xff0c;一脸懵直接崩。 …

React表单处理:如何获取输入框(input)的值?(受控组件)

系列回顾&#xff1a; 在前面的文章中&#xff0c;我们已经掌握了State、Props、事件处理、列表渲染和条件渲染。我们的应用已经能展示动态内容并响应用户的点击。现在&#xff0c;我们要 tackling 一个非常常见的需求&#xff1a;如何获取用户在表单输入框&#xff08;<inp…

探索现代 Web 开发:从 HTML5 到 Vue.js 的全栈之旅

在当今快速发展的互联网时代&#xff0c;Web 开发已经成为构建数字世界的重要基石。无论是企业级应用、社交媒体平台&#xff0c;还是个人博客和电商平台&#xff0c;Web 技术都在背后默默支撑着这些系统的运行。随着前端技术的不断演进&#xff0c;开发者们已经不再局限于传统…

ElasticSearch聚合查询从15秒到1.2秒的深度优化实践

一、问题背景 在金融风控场景中,我们需要对90天内的交易数据进行多维度聚合分析(按风险等级、地区、金额分段等)。随着数据量增长到日均3000万+记录,原有查询响应时间逐渐恶化至15秒以上,严重影响了业务决策效率。 二、原始架构性能分析 1. 集群拓扑 # 原单节点配置 N…

2025.06.09【读书笔记】|PromptBio:让生信分析更简单的AI平台

文章目录 一、PromptBio 是什么&#xff1f;二、主要功能介绍1. 对话式智能体&#xff0c;像聊天一样做分析2. 自动化工作流&#xff0c;省时省力3. 数据管理一站式搞定4. 机器学习也能一键搞定5. “无代码”到“全代码”&#xff0c;人人都能用 三、适合哪些人用&#xff1f;四…

实战解析:如何用克魔(KeyMob)等工具构建iOS应用稳定性与数据可观测体系

在iOS开发项目逐渐走向复杂化的今天&#xff0c;团队对“可观测性”的要求正不断提升。开发者不仅要知道App是否运行正常&#xff0c;更要明确“为什么异常、在哪里异常、是否可复现”。传统的调试工具往往侧重单一维度&#xff0c;要么是资源监控、要么是日志分析&#xff0c;…

如何轻松实现多源混算报表

报表作为综合业务&#xff0c;数据来源多种多样。传统实现多源混合查询报表要通过 ETL 将数据同库&#xff0c;但这种方式数据时效性太差使用场景受限。通过逻辑数仓能获得较强的数据实时性&#xff0c;但体系又过于沉重&#xff0c;为报表业务搭建逻辑数仓有点得不偿失。需要一…

Docker|简单入门

文章目录 Docker简介Docker和虚拟机的联系和区别基本原理和概念镜像容器仓库 Docker安装配置容器化和Dockerfile实践环节Docker Compose Docker简介 Docker是一个用于构建build、运行run、传送share应用程序的平台&#xff0c;可以把应用程序打包成一个个的集装箱&#xff0c;…

阿里云云原生数据库PolarDB和普通云数据库的区别?

文章目录 前言一、云数据库的演进&#xff1a;从“托管”到“原生”的跨越二、PolarDB的核心创新&#xff1a;重新定义云数据库的能力边界1. 存算分离架构&#xff1a;打破资源绑定的“枷锁”2. 多模引擎与兼容生态&#xff1a;降低应用迁移成本3. 智能化运维&#xff1a;让数据…

SNN学习(4):真实的生物神经学中神经元和人脑结构学习

目录 一、基础知识 1 简单神经元回路中的信号运作 2 高级功能相关的复杂神经元回路 3 细胞体、树突和轴突 3.1 神经元细胞 3.2 非神经元细胞 3.3 神经胶质细胞 3.4 神经细胞的信号传递 3.4.1 动作电位的特性 3.4.2 兴奋和抑制 3.4.3 电传递 二、大脑皮层及视觉系统…

第六天 界面操作及美化(6.1 建立菜单及异步调用)

6.1 建立菜单及异步调用 在程序中&#xff0c;菜单&#xff08;Menu&#xff09;是一种常见的用户界面元素&#xff0c;在程序中起到了组织功能、提高用户体验、提供快捷方式和帮助文档等重要作用。通过合理使用菜单&#xff0c;可以使程序的功能更加清晰、操作更加便捷&#…

论文解析:一文弄懂ResNet(图像识别分类、目标检测)

目录 一、相关资源 二、Motivation 三、技术细节 1.残差学习过程 2.快捷连接类型 (1)Identity Shortcuts&#xff08;恒等捷径&#xff09; (2)Projection Shortcuts&#xff08;投影捷径&#xff09; (3)两种捷径对比 3.深层瓶颈结构Deeper Bottleneck Architectures…