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

news2025/7/31 5:57:16

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.coloradmin.cn/o/2406997.html

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

相关文章

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说&#xff0c;在叠衣服的过程中&#xff0c;我会带着团队对比各种模型、方法、策略&#xff0c;毕竟针对各个场景始终寻找更优的解决方案&#xff0c;是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展&#xff0c;其高效、便捷、协议开放、易于冗余等诸多优点&#xff0c;被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口&#xff0c;具有实时性、开放性&#xff0c;使用TCP/IP和IT标准&#xff0c;符合基于工业以太网的…

9-Oracle 23 ai Vector Search 特性 知识准备

很多小伙伴是不是参加了 免费认证课程&#xff08;限时至2025/5/15&#xff09; Oracle AI Vector Search 1Z0-184-25考试&#xff0c;都顺利拿到certified了没。 各行各业的AI 大模型的到来&#xff0c;传统的数据库中的SQL还能不能打&#xff0c;结构化和非结构的话数据如何和…

mac:大模型系列测试

0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何&#xff0c;是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试&#xff0c;是可以跑通文章里面的代码。训练速度也是很快的。 注意…

DBLP数据库是什么?

DBLP&#xff08;Digital Bibliography & Library Project&#xff09;Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高&#xff0c;数据库文献更新速度很快&#xff0c;很好地反映了国际计算机科学学术研…

Xela矩阵三轴触觉传感器的工作原理解析与应用场景

Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知&#xff0c;帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量&#xff0c;能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度&#xff0c;还为机器人、医疗设备和制造业的智…

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态

前言 在人工智能技术飞速发展的今天&#xff0c;深度学习与大模型技术已成为推动行业变革的核心驱动力&#xff0c;而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心&#xff0c;系统性地呈现了两部深度技术著作的精华&#xff1a;…

stm32wle5 lpuart DMA数据不接收

配置波特率9600时&#xff0c;需要使用外部低速晶振

Unity中的transform.up

2025年6月8日&#xff0c;周日下午 在Unity中&#xff0c;transform.up是Transform组件的一个属性&#xff0c;表示游戏对象在世界空间中的“上”方向&#xff08;Y轴正方向&#xff09;&#xff0c;且会随对象旋转动态变化。以下是关键点解析&#xff1a; 基本定义 transfor…

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合

作者&#xff1a;来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布&#xff0c;Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明&#xff0c;Elastic 作为 …

MySQL的pymysql操作

本章是MySQL的最后一章&#xff0c;MySQL到此完结&#xff0c;下一站Hadoop&#xff01;&#xff01;&#xff01; 这章很简单&#xff0c;完整代码在最后&#xff0c;详细讲解之前python课程里面也有&#xff0c;感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解

进来是需要留言的&#xff0c;先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码&#xff0c;输入的<>当成字符串处理回显到页面中&#xff0c;看来只是把用户输…

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG

TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码&#xff1a;HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…

Linux中《基础IO》详细介绍

目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改&#xff0c;实现简单cat命令 输出信息到显示器&#xff0c;你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…

【Veristand】Veristand环境安装教程-Linux RT / Windows

首先声明&#xff0c;此教程是针对Simulink编译模型并导入Veristand中编写的&#xff0c;同时需要注意的是老用户编译可能用的是Veristand Model Framework&#xff0c;那个是历史版本&#xff0c;且NI不会再维护&#xff0c;新版本编译支持为VeriStand Model Generation Suppo…

Ubuntu系统多网卡多相机IP设置方法

目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机&#xff0c;交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息&#xff0c;系统版本&#xff1a;Ubuntu22.04.5 LTS&#xff1b;内核版本…

《Docker》架构

文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器&#xff0c;docker&#xff0c;镜像&#xff0c;k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…

ubuntu22.04有线网络无法连接,图标也没了

今天突然无法有线网络无法连接任何设备&#xff0c;并且图标都没了 错误案例 往上一顿搜索&#xff0c;试了很多博客都不行&#xff0c;比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动&#xff0c;重新安装 操作步骤 查看自己网卡的型号 lspci | gre…

【堆垛策略】设计方法

堆垛策略的设计是积木堆叠系统的核心&#xff0c;直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法&#xff0c;涵盖基础规则、优化算法和容错机制&#xff1a; 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则&#xff1a; 大尺寸/重量积木在下&#xf…