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

CMake学习笔记(一):工程的新建和如何将源文件生成二进制文件

cmake是我们在工作过程中比较常见的一个工具,该系列文章是自己用来学习的笔记。目前只是记录下自己学习cmake的过程中的一些重要的知识点,其是以项目需求为导向并非完整的cmake的学习路线和系统,同样也并非适合所有的人。

1.生成一个可执行文件

        当我们写好一个代码文件的时候我们想去验证代码就需要通过编译器把我们的代码编译成一个可执行文件,我们当然可以使用编译命令去生成可执行文件;但是这个只是针对于一个cpp,当我们的功能稍微复杂些的时候,需要包含多个cpp的时候,使用命令就显得太繁冗了。所以我们这里就可以直接使用cmake。我们首先新建文件夹lession1,然后再文件夹下新建如下的文件(文件夹暂时先不创建):CMakeLists.txt ,add.cpp ,div.cpp ,head.h ,main.cpp ,mul.cpp ,sub.cpp

上述文件中的内容如下:

add.cpp:

#include <iostream>
#include "head.h"
int Add(int a,int b){
    return a+b;
}

div.cpp:

#include <iostream>

float div(float a,float b){
    if(0 == b){
        std::cout<<"Erro denominator is zero\n";
        return -1;
    }
        
    return a / b;
}

head.h:

#ifndef  _HEAD_H
#define _HEAD_H

int Add(int a,int b);
int Sub(int a,int b);
int Mul(int a,int b);
float div(float a,float b);
#endif

mul.cpp:

#include <iostream>

int Mul(int a,int b){
    return a*b;
}

sub.cpp:

#include <iostream>

int Sub(int a,int b){
    return a-b;
}

main.cpp:

#include<stdio.h>
#include "head.h"

int main()
{
    int a = 20;
    int b = 12;
    printf("a = %d,b = %d\n",a,b);
    printf("a + b = %d\n",Add(a,b));
    printf("a - b = %d\n",Sub(a,b));
    printf("a * b = %d\n",Mul(a,b));
    printf("a / b = %f\n",div(a,b));
}

这里我们只是简单的把加减乘除分别放到四个不同的app里面,然后再head.h里面声明,在main.cpp里面使用。现在我们需要使用cmakelists.txt把这几个cpp一起编译成一个可执行的文件:

cmake_minimum_required(VERSION 3.0)#指定最低cmake版本的命令
project("cmake_learn")#定义工程名称
#--------------------------------------------------------------------------------
#add_executabl(可执行文件名 源文件名称1 源文件名称2; ... 源文件名称n)
add_executable(cmake_lession2 
    div.cpp
    mul.cpp;
    sub.cpp;
    add.cpp
    main.cpp
)#定义工程生成一个可执行文件

相关的关键字和功能请参考上述内容,当我们完成上述的文件的内容后,我们再CMakeLists.txt文件的同级目录下新建一个build文件,并且在命令框中进入到build文件中,并执行cmake ../, 这里的../是为了指定到CMakeLists.txt。当我们执行cmake ../后没有报错的情况下我们执行make -j8,或者直接make。这里的-j8是指使用8线程进行编译,但是有些虚拟机没有这么多线程,所以也可以直接执行make。执行完上述步骤后应该是如下的结果:

然后就会生成我们的目标二进制文件cmake_lession2,我们直接执行即可。结果如下:

相关文章:

  • conda 更换镜像究极方法
  • 新品速递 | 多通道可编程衰减器+矩阵系统,如何破解复杂通信测试难题?
  • YOLO11改进-模块-引入多域学习MDL(Multi-Domain Learning) 使用频域增强图像特征
  • jQuery UI 简介
  • IntelliJ IDEA集成MarsCode AI
  • Java开发的AI应用框架简述——LangChain4j、Spring AI、Agent-Flex
  • 将PDF转为Word的在线工具
  • 从@Param注解开始,深入了解 MyBatis 参数映射的原理
  • 3.6V-30V宽压输入降压同步IC内置MOS,电流4A/5A/6A,可以满足汽车应急电源,BMS电池,电池组USB口输出等储能应用
  • SpringBoot 校园新闻网站
  • python网络爬虫开发实战之基本库使用
  • 基于qt的桌面宠物——纳西妲源码纯享
  • CS144 Lab Checkpoint 5: down the stack (the network interface)
  • http status是什么?常见的http状态码指的是什么意思?
  • FPGA开发,使用Deepseek V3还是R1(9):FPGA的全流程(详细版)
  • C语言_图书管理系统_借阅系统管理
  • 极狐GitLab 17.9 正式发布,40+ DevSecOps 重点功能解读【三】
  • 毕业项目推荐:基于yolov8/yolov5/yolo11的暴力行为检测识别系统(python+卷积神经网络)
  • C# Unity 唐老狮 No.6 模拟面试题
  • DRMPlaneType里有VIG, DMA,和RGB三种类型,这是不是说明DRMPlane就是代表DPU里的Pipeline
  • 网站建设找酷风/对网站和网页的认识
  • 做淘客网站需要多大的空间/苏州网站建设方案
  • 国外设计网站app/如何去除痘痘有效果
  • 网站群建设方案/西安seo代运营
  • 网站如何做友情链接/全媒体运营师培训
  • 深圳网站建设兼职/重庆seo小潘大神