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

makefile和CMakeLists/C++包管理器

make

  • 大家可能会很奇怪,都什么年代了,还学makefile,cmake都有些过时了,为什么还要再学这个呢?

  • 我是这么看待这个问题的,cmake跨平台性还是很有有优势的,有着多年积累的底蕴,借助大模型可以很好的利用这个工具。而cmake的原理就是自动生成makefile,所以还是很值得学习makefile,了解历史的。

  • makefile和CMakeLists

    • 当只是编写一个文件的代码时,直接使用命令运行很方便。但是一但项目复杂起来后,就会难以管理,这个时候使用自动化构建工具就会十分方便,常用的构建工具有make和Cmake。make通过makefile对项目进行管理。Cmake通过配置生成适应各操作系统版本的makefile文件有着很好的跨平台性。

一、makefile

  1. 简单的编译运行命令(g++为例C++,g++会自动连接依赖库,适用于C++)

    g++ <依赖文件> -o <目标文件>

  2. makefile的规则

    <目标文件> : <依赖文件>

    <要执行的命令>

    hello: main.c message.cgcc main.c message.c -o hello
    
  3. makefile特征

    1. makefile的扩展名是.mk,但是创建的时候直接忽略就好

    2. 执行的命令前面必须是tab键

    3. 实际情况应该是先编译后再链接,推荐此种写法

      在这里插入图片描述

    4. 伪目标:不生成目标文件的目标,只是一个标签,最常用的就是clean和all,clean常用来产生的临时文件

      在这里插入图片描述

      • 伪目标注意:

        1. 不要和文件名重复,因为伪目标运行的时候是make <伪目标>这样的格式,而也有这种类型的命令make <file>来指定目标的生成,所以如果伪目标和文件名重复,则会冲突

        2. 解决方案,在开头加上.PHONY: <伪目标>,来显示告诉编译器,这就是个伪目标

          在这里插入图片描述

        3. 当需要同时执行多个可执行文件的生成的时候就可以使用all伪目标,格式伪all: <目标文件> <目标文件>,当然把all放在除.PHONY: <伪目标>之后,make直接执行默认也是为目标所指定的所有目标文件

          在这里插入图片描述
          在这里插入图片描述

      1. 同一种规则和依赖文件的简化写法

        在这里插入图片描述

      2. 禁止执行的命令行输出打印在终端上

        在这里插入图片描述
        在这里插入图片描述

        在对应命令加上@就好

      3. 使用变量,常常讲一些命令行参数以及源文件、目标文件、编译文件使用变量定义
        在这里插入图片描述

        1. 特殊符号,常说$<其它特殊符号组成>

          $@代表目标文件

          $<代表第一个依赖文件

          $^代表所有依赖文件

          在这里插入图片描述

        2. 通配符:所有的cpp文件和o文件

          在这里插入图片描述

        3. 更多的分支循环

  4. make

    1. make是按照时间戳来判断是否更新目标文件的,若时间戳不变则无法改变,下图为windows系统,与mac和linux有些许差异

      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

    2. 如何运行伪目标

      make <伪目标>在这里插入图片描述

    3. 参数

      1. -f参数指定makefile的文件,可以修改makefile的名称,使用的时候加上-f指向修改好的文件就好

      2. -n参数打印出要执行的命令,但不会执行,常用来用来调试

      3. -C参数调用子模块的makefile

        在这里插入图片描述

二、cmake中的CMakeLists

  1. 基本写法

    cmake_mininum_required(VERSION 3.10)//最小版本指定
    project(HelloWorld)//项目名字
    set(Source main.c)//定义变量
    add_executable(hello ${Source})
    //`<目标文件> : <依赖文件>`
    //	`<要执行的命令>`
    
  2. 优势:

    1. 跨平台性、跨编译器
  3. 其它功能:指定编译选项、链接库、生成静态库、动态库等等

  • 大家应该会很奇怪,前面都说cmake好了,要学习,为什么就讲了这么点内容,我觉得学习这些基础的框架就够了,其它的依靠大模型的帮助会更有性价比。这里可能大家觉得我有些双标,我觉得工具的魅力是它的底蕴,是需要了解它,但是真正用到实际的时候,还是好的漂亮的代码最棒。大模型的代码比大部分写的代码都要合理,因为其训练数据种包含着拥有无数高质量代码的github。
http://www.lryc.cn/news/449510.html

相关文章:

  • STM32 通过软件模拟 I2C 驱动 24Cxx 系列存储器
  • Go语言匿名字段使用与注意事项
  • 2024最新!!Java后端面试题(2)看这一篇就够了
  • 超好用的10款视频剪辑软件,从入门到精通
  • python股票因子,交易所服务器宕机,量化交易程序怎么应对
  • 瑞芯微RK3566鸿蒙开发板Android11修改第三方输入法为默认输入法
  • 使用nest+typeorm框架写数据库导致mysql的binlog暴增记录
  • 组合逻辑元件与时序逻辑元件
  • 天龙八部怀旧单机微改人面桃花+安装教程+GM工具+虚拟机一键端
  • docker管理
  • electron教程(三)窗口设置
  • 图像增强论文精读笔记-Deep Retinex Decomposition for Low-Light Enhancement(Retinex-Net)
  • 2024年配置YOLOX运行环境+windows+pycharm24.0.1+GPU
  • vue-i18n在使用$t时提示类型错误
  • 大厂面试真题-什么是CAS单点登录?什么原理
  • 用Java提取PDF表格到文本、CSV、Excel工作表
  • OpenCV视频I/O(10)视频采集类VideoCapture之从视频流中检索一帧图像函数 retrieve()的使用
  • 【RocketMQ】SpringBoot整合RocketMQ
  • mysql replace无法替换空格?如何解决
  • Redis篇(环境搭建)
  • 【C++题目】7.双指针_和为 s 的两个数字
  • 网络通信1-传输层
  • 【JAVA源码授权】
  • tauri开发软件中,使用tauri自带的api用浏览器打开指定的url链接
  • OpenCV-图像拼接
  • C++【类和对象】(取地址运算符重载与实现Date类)
  • oracle 数据库中的异常和游标管理
  • 关于python 日志设定为INFO 但是DEBUG仍旧写入的问题
  • TypeScript 语法基础 第一部分 类型
  • GO Serial 学习与使用