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

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,我们直接执行即可。结果如下:


http://www.kler.cn/a/573186.html

相关文章:

  • 详细介绍 conda 的常用命令和使用方式
  • pdfplumber 解析 PDF 表格的原理
  • NUMA架构介绍
  • 50.xilinx fir滤波器系数重加载如何控制
  • K8S学习之基础十三:k8s中ReplicaSet的用法
  • 【单片机】嵌入式系统的硬件与软件特性
  • ios使用swift调用deepseek或SiliconFlow接口
  • 网络编程——UDP
  • Java 8 新特性
  • PCA(主成分分析)核心原理
  • Git 2.48.1 官方安装与配置全流程指南(Windows平台)
  • Libgdx游戏开发系列教程(6)——游戏暂停
  • 人工智能直通车系列02【Python 基础与数学基础】(控制流线性代数:向量基本概念)
  • 基于SpringBoot的在线骑行网站的设计与实现(源码+SQL脚本+LW+部署讲解等)
  • SpringMvc与Struts2
  • Switch开关的防抖监听器
  • libcoap在Ubuntu下的编译(基于CMake)
  • Kafka、RabbitMQ、RocketMQ的区别
  • vscode user settings.json分享
  • 数据守护:备份文件的重要性及自动化实践