当前位置: 首页 > news >正文

【C++】CMake入门

CMake 是一个跨平台的构建系统生成工具,可以生成用于编译和链接应用程序的构建文件(如 Makefile 或 Visual Studio 工程文件)。

安装 CMake

Windows

  • 可以从 CMake官网 下载并安装 Windows 版本的 CMake。
  • 安装完成后,确保将 CMake 添加到系统 PATH 环境变量中。

Linux

sudo apt-get update
sudo apt-get install cmake

单个源文件项目

我们需要提供源文件和向CMake提供项目配置描述。该描述使用CMake完成,完整的文档可以在 https://cmake.org/cmake/help/latest/ 找到。

准备

创建一个简单的 C++ 项目,包含以下文件:

  • CMakeLists.txt
  • main.cpp

我们希望将 main.cpp 源代码编译为单个可执行文件:

#include<iostream>
int main(){std::cout<<"Hello world"<<std::endl;return 0;
}

CMakeLists.txt

# 设置CMake所需的最低版本。如果使用的CMake版本低于该版本,则会发出致命错误
cmake_minimum_required(VERSION 3.10)# 声明了项目的名称(Test)和支持的编程语言(CXX代表C++)
project(Test CXX)# 指示CMake创建一个新目标:可执行文件main。这个可执行文件是通过编译和链接源文件main生成的。CMake将为编译器使用默认设置,并自动选择生成工具
add_executable(main main.cpp)

生成

打开命令提示符,导航到项目目录,然后运行:

mkdir build
cd build
cmake ..

或者使用,具有相同效果:

# 该命令是跨平台的,使用了-H和-B为CLI选项。-H表示当前目录中搜索根CMakeLists.txt文件。-Bbuild告诉CMake在一个名为build的目录中生成所有的文件
cmake -H. -Bbuild

项目的配置已经在build目录中生成。我们现在可以编译可执行文件:

cmake --build .

切换生成器

CMake是一个构建系统生成器,可以使用单个CMakeLists.txt为不同平台上的不同工具集配置项目。您可以在CMakeLists.txt中描述构建系统必须运行的操作,以配置并编译代码。基于这些指令,CMake将为所选的构建系统(Unix Makefile、Ninja、Visual Studio等等)生成相应的指令。

  • Visual Studio 编译器 (MSVC):适用于 Windows 系统,常用生成器是 NMake MakefilesVisual Studio.
  • MinGW 或 MSYS2:适用于 Windows 系统,可以使用 MinGW Makefiles.
  • Unix Makefiles:适用于类 Unix 系统,例如 Linux 或 macOS。
cmake -Bbuild -G "NMake Makefiles"

多个可执行文件和库项目

准备

目录结构如下:

MyProject/
├── include/
│   └── say.hpp
├── src/
│   ├── main.cpp
│   └── say.cpp
├── lib/
└── bin/
# main.cpp#include"say.hpp"
int main() {say();return 0;
}
# say.cpp#include<iostream>
#include"say.hpp"
void say(){std::cout<<"Hello world!"<<std::endl;
}
# say.hpp#pragma once
void say();

CMakeLists.txt

我们需要编写 CMakeLists.txt 文件来编译这些文件并链接库。

# 指定 CMake 的最低版本要求
cmake_minimum_required(VERSION 3.10)# 定义项目名称和版本
project(test VERSION 1.0.0)# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)# 添加 include 目录到编译器的头文件搜索路径
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)# 设置库和可执行文件输出路径
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin)# 创建静态库目标
add_library(messageSTATIC # 若动态库则参数为SHARED${CMAKE_CURRENT_SOURCE_DIR}/src/say.cpp
)# 添加可执行文件
add_executable(test${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp
)# 链接静态/动态库到可执行文件
target_link_libraries(test say)

生成

打开命令提示符或终端,导航到项目根目录:

cd Test

创建 build 目录并导航到其中:

mkdir build
cd build

运行 CMake 配置命令:

cmake ..

运行构建命令:

cmake --build .

相关文章:

【C++】CMake入门

CMake 是一个跨平台的构建系统生成工具&#xff0c;可以生成用于编译和链接应用程序的构建文件&#xff08;如 Makefile 或 Visual Studio 工程文件&#xff09;。 安装 CMake Windows 可以从 CMake官网 下载并安装 Windows 版本的 CMake。安装完成后&#xff0c;确保将 CMak…...

云WAF | 云waf保护你的网络安全

随着时代的发展&#xff0c;云计算与网络安全成为当今社会的热点问题。由于网络环境的日益复杂&#xff0c;网络安全问题日益突出&#xff0c;网络安全问题日益突出。近年来&#xff0c;各类网络安全工具与技术层出不穷&#xff0c;以保障用户信息及企业财产安全。云服务防火墙…...

c++初阶知识——类和对象(1)

目录 1.类和对象 1.1 类的定义 1.2 访问限定符 1.3 类域 2.实例化 2.1 实例化概念 2.2 对象大小 内存对齐规则 3.this指针 1.类和对象 1.1 类的定义 &#xff08;1&#xff09;class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{}中为类的主体&#xf…...

Vue 3 组件通信全解:从基础到高级技巧

引言 Vue 3 引入了 Composition API&#xff0c;这为组件通信带来了新的灵活性和强大的功能。 组件通信基础 组件的定义和作用 在前端开发中&#xff0c;组件可以被看作是构建用户界面的独立单元。它封装了特定的功能和样式&#xff0c;可以被重复使用&#xff0c;并且可以…...

大众汽车入职SHL在线测评、英语口语、招聘笔试如何通过、考点分析|备考建议

大众汽车入职在线测验真题考点分析&#xff0c;通过技巧&#xff1f; 大众汽车集团&#xff08;中国&#xff09;在招聘过程中&#xff0c;认知能力测试是评估候选人是否适合某个职位的重要环节。候选人会收到带有线上测评链接的邮件&#xff0c;测评包括胜任力潜力测试(Compe…...

《植物大战僵尸杂交版》2.2:新版本体验与下载指南

作为《植物大战僵尸》系列的忠实粉丝&#xff0c;我最近发现了一款令人兴奋的改版游戏——《植物大战僵尸杂交版》2.2。这款游戏不仅保留了原作的经典元素&#xff0c;还加入了一些创新的玩法&#xff0c;让我忍不住想要分享给大家。 2.2版本新体验 新僵尸登场 最新版本中&am…...

7月11日学习打卡,数据结构栈

大家好呀&#xff0c;本博客目的在于记录暑假学习打卡&#xff0c;后续会整理成一个专栏&#xff0c;主要打算在暑假学习完数据结构&#xff0c;因此会发一些相关的数据结构实现的博客和一些刷的题&#xff0c;个人学习使用&#xff0c;也希望大家多多支持&#xff0c;有不足之…...

数据结构第20节 快速排序以及优化

快速排序是一种非常高效的排序算法&#xff0c;由英国计算机科学家托尼霍尔&#xff08;Tony Hoare&#xff09;在1960年代发明。它使用分治法&#xff08;Divide and Conquer&#xff09;策略来把一个序列分为较小的部分&#xff0c;然后递归地排序这些部分。 快速排序的基本…...

3分钟理解超键、候选键、主键

1.超键 在关系模式中&#xff0c;能唯一标识实体实例的任何属性集 学生&#xff08;学号&#xff0c;姓名&#xff0c;性别&#xff0c;专业编号&#xff0c;年龄&#xff09; 通过学号可以找到一个学生的姓名、性别、专业号、年龄&#xff0c;但是通过姓名不一定能找到这些…...

Centos忘记密码,重置root密码

Centos忘记密码&#xff0c;重置root密码 操作环境&#xff1a;Centos7.6 1、选择包含rescue的选项&#xff0c;按e进入编辑模式 首先&#xff0c;我们需要重启系统&#xff0c;进入开机引导菜单界面。在这里&#xff0c;我们可以看到系统的内核版本和启动参数等信息。我们需…...

Android初学者书籍推荐

书单 1.《Android应用开发项目式教程》&#xff0c;机械工业出版社&#xff0c;2024年出版2.《第一行代码Android》第二版3.《第一行代码Android》第三版4.《疯狂Android讲义》第四版5.《Android移动应用基础教程&#xff08;Android Studio 第2版&#xff09;》 从学安卓到用安…...

安卓文件上传照片单张及多张照片上传实现

一、首先导入对应库 //网络请求库 implementation com.squareup.okhttp3:okhttp:3.9.0//Gson解析 implementation com.google.code.gson:gson:2.10.1 二、然后就是们实现上传方法 UploaderTool.java import android.util.Log;import com.google.gson.Gson;import java.io.File…...

小白学webgl合集-import.meta.url 和 new URL() bug

为什么使用 import.meta.url 和 new URL() 动态路径解析&#xff1a; 在 ESM&#xff08;ECMAScript Modules&#xff09;环境中&#xff0c;import.meta.url 提供了当前模块的完整 URL。结合 new URL()&#xff0c;你可以基于这个 URL 动态解析其他资源的路径。这样可以确保路…...

pico+unity3d开启彩色透视

1、点击游戏对象、点击XR、点击添加XR Origin&#xff0c;并把自带的摄像对象删除 2、添加脚本 using System.Collections; using System.Collections.Generic; using UnityEngine; using Unity.XR.PXR;//引入xr对象 public class toushi : MonoBehaviour {// Start is called…...

python常用命令

文章目录 1. 安装模块 1. 安装模块 pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple (切换数据源&#xff09;...

使用定时器消除抖动

问题&#xff1a;定时器中断和按键中断属于什么操作模式&#xff0c;轮询吗&#xff1f; 具体怎么实现 定时器中断 &#xff08;判断&#xff09; 时间参数 按键中断&#xff08;修改&#xff09; 中断 向量表.s文件 DCD SysTick_Handler …...

IOS热门面试题一

GCD&#xff08;Grand Central Dispatch&#xff09;是什么&#xff1f;如何在iOS中使用它&#xff1f; GCD&#xff08;Grand Central Dispatch&#xff09;是什么&#xff1f; GCD&#xff08;Grand Central Dispatch&#xff09;是苹果公司开发的一套多线程编程的API&…...

构建LangChain应用程序的示例代码:62、如何使用Oracle AI向量搜索和Langchain构建端到端的RAG(检索增强生成)pipeline

Oracle AI 向量搜索与文档处理 Oracle AI向量搜索专为人工智能(AI)工作负载设计&#xff0c;允许您基于语义而非关键词来查询数据。 Oracle AI向量搜索的最大优势之一是可以在单一系统中结合对非结构化数据的语义搜索和对业务数据的关系搜索。 这不仅功能强大&#xff0c;而且…...

ffmpeg转换MP4为gif命令

这里记录一下使用 ffmpeg去转化 gif 的一些快捷命令 # 直接转换 ffmpeg -i 222.mp4 -r 12 222.gif# 调色板优化处理 ffmpeg -i 222.mp4 -r 12 -vf "split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" 222.gif第二条命令的解释如下&#xff1a; split[s0][s1]&am…...

kotlin Flow 学习指南 (三)最终篇

目录 前言Flow生命周期StateFlow 替代LiveDataSharedFlow其他常见应用场景处理复杂、耗时逻辑存在依赖关系的接口请求组合多个接口的数据 Flow使用注意事项总结 前言 前面两篇文章&#xff0c;介绍了Flow是什么&#xff0c;如何使用&#xff0c;以及相关的操作符进阶&#xff…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...