首页 > 其他分享 >CMake学习(一)

CMake学习(一)

时间:2024-07-27 23:06:31浏览次数:13  
标签:可执行文件 CMakeLists cmake 学习 构建 CMake main

CMake学习(一)

1、简介

image
CMake是一个强大的软件构建系统,可以用简单的语句来描述所有平台的安装(编译过程)
可以编译源代码、制作程序库、产生适配器(wrapper)、还可以用任意的顺序建构执行档

https://cmake.org/

2、构建基础项目

最基础的 CMake 项目是由单个源代码文件构建的可执行文件
对于这种简单的需求,我们所需要用到的仅仅是一个名为CMakeLists.txt的文件以及三条命令

cmake_minimum_required()

任何项目最顶层的CMakeLists.txt文件必须以cmake_minimum_required()命令开头,用来指定最小支持的CMake版本
这将建立策略设置,并确保随后编写的CMake配置能够在兼容的CMake版本下执行

project()

如果想要启动一个项目,那么就使用project()来设置项目的名称
每个项目都需要调用该命令,并且应在 make_minimum_required() 之后尽快调用
除此以外,该命令还可用于指定其他项目级信息,如语言或版本号

add_executable()

add_executable() 命令告诉 CMake 使用指定的源代码文件创建一个可执行文件

2.1、文件配置

直接创建一个目录cmake_demos,里面只放两个文件,一个是源代码文件main.cpp,另一个是CMake的配置文件CMakeLists.txt
image
main.cpp文件中是简单的C++代码

#include<iostream>
int main()
{
    std::cout << "Hello, CMake!" << std::endl;
}

CMakeLists.txt依照以上内容进行一些项目配置

# 指定最低支持的CMake版本
cmake_minimum_required(VERSION 3.10)
# 设置项目名称
project(Beginner)
# 将指定源文件编译成可执行文件
add_executable(App main.cpp)

简单看下我们的配置,首先,声明了支持的CMake版本最低支持到3.10,因此低于该版本的CMake无法执行构建任务
后面紧接着声明了项目名称,此时项目名称会被存储到PROJECT_NAME变量当中,如果当前是顶层的CMakeLists.txt,还会存储到CMAKE_PROJECT_NAME变量中
最后一句则是表示根据当前目录下的main.cpp源文件生成名为App的可执行文件

2.2、构建执行

理解了配置的含义,接下来开始正式进行项目的构建吧~~
首先,在当前目录创建一个build目录,之后构建的文件会放到这里面
image
然后打开终端,导航到build目录下
image
执行cmake ..,意思是对上级目录里的内容进行项目配置,生成一个本地的构建系统
image
此时,build目录下会多出一大堆东西
image
然后,是真正的构建环节,根据配置对项目进行编译链接,执行cmake --build .命令,基于当前目录生成的内容进行构建,并生成可执行文件
image
此时,可执行文件会出现在Debug目录下
image
执行App.exe,正是main.cpp里面我们编写的功能
image
此时,一个最小型的CMake项目就已经构建完成了

标签:可执行文件,CMakeLists,cmake,学习,构建,CMake,main
From: https://www.cnblogs.com/mint-garden/p/18327670

相关文章

  • 《昇思25天学习打卡营第7天|函数式自动微分》
    函数式自动微分神经网络的训练主要使用反向传播算法,模型预测值(logits)与正确标签(label)送入损失函数(lossfunction)获得loss,然后进行反向传播计算,求得梯度(gradients),最终更新至模型参数(parameters)。自动微分能够计算可导函数在某点处的导数值,是反向传播算法的一般化。自动微分......
  • 《昇思25天学习打卡营第5天|数据变换 Transforms》
    数据变换Transforms通常情况下,直接加载的原始数据并不能直接送入神经网络进行训练,此时我们需要对其进行数据预处理。MindSpore提供不同种类的数据变换(Transforms),配合数据处理Pipeline来实现数据预处理。所有的Transforms均可通过map方法传入,实现对指定数据列的处理......
  • 学习c语言第十五天(初阶测评)
    选择题1.下列程序输出结果为672.下列程序输出结果为 死循环打印3.i和j的值分别为什么 214.k的终值是什么905.输出结果是什么 16.正确的是    C7.C语言规定main函数位置    C8.不正确的是    D9.正确的是     c ......
  • [rCore学习笔记 018]实现特权级的切换
    写在前面本随笔是非常菜的菜鸡写的。如有问题请及时提出。可以联系:[email protected]:https://github.com/WindDevil(目前啥也没有本节内容因为risc-v存在硬件特权级机制,我们又要实现一个可以使得应用程序工作在用户级,使得操作系统工作在特权级.原因是要保证用户态的......
  • 每周Java学习汇总
    字符串(String):在Java中,字符串是一个非常重要的数据类型。它是不可变的,意味着一旦创建,就不能更改其内容。字符串可以用双引号(“”)表示。Java提供了许多处理字符串的方法,如拼接、截取、查找、替换等。自增自减运算符(++和--):自增运算符(++)和自减运算符(–)用于对变量进行加1或减1的操......
  • java学习进程4
    在这一周的学习中,我主要集中在Java编程的基础知识及其核心概念的理解上。以下是我本周所做的一些具体活动:本周学习活动面向对象编程(OOP)基本概念:本周我深入学习了面向对象编程的基本概念,了解了类、对象、属性和方法的定义及其在Java中的应用。同时也理解了对象如何通过......
  • Java学习第四周
    /**测试条件(三元)连接符的用法*/publicclassTestOperator06{publicstaticvoidmain(String[]args){intscore=90;Stringa=score<60?"不及格":"及格";System.out.println(a); if(score<60){ a="不及格"; }else{ a="及格"; } i......
  • 第四周学习报告
    又经过了一周的学习,今天对本周学习进行总结本周学习了面向对象和字符串的相关知识面向对象类和对象类的定义通过关键字class来定义classMyClass{//属性intnumber;Stringname;//方法voiddisplay(){System.out.println......
  • 【学习笔记】最短路
    【学习笔记】最短路前言:只是对一些最短路算法的实现整理。以下内容有部分摘自OI_wiki。Floyd算法求全源最短路。可以有负边权。Floyd算法的本质是动态规划。设\(dis(k,i,j)\)表示由若干个编号不超过\(k\)的节点中转后从\(i\)到\(j\)的最短路。该“动规”有两......
  • (leetcode学习)236. 二叉树的最近公共祖先
    给定一个二叉树,找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树T的两个节点p、q,最近公共祖先表示为一个节点x,满足x是p、q的祖先且x的深度尽可能大(一个节点也可以是它自己的祖先)。”示例1:输入:root=[3,5,1,6,2,0,8,nul......