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

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.c
    	gcc 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.kler.cn/news/326794.html

相关文章:

  • 七、添加攻击音效
  • 汽车出险报告接口介绍及作用
  • Docekrfile和docker compose编写指南及注意事项
  • Android常用C++特性之std::this_thread
  • python14_运算符复合赋值
  • 【韩顺平Java笔记】第4章:运算符
  • SpringIOCDI
  • CaChe的基本原理
  • ECMAScript标准的详细解析
  • sql-labs:42~65
  • AIGC对网络安全的影响
  • ansible之playbook\shell\script模块远程自动安装nginx
  • Python 时间占位符:毫秒的使用
  • TDengine 签约国家电投旗下四大火力发电厂,助力汽轮机振动数据的有效管理
  • 大模型增量训练--基于transformer制作一个大模型聊天机器人
  • 使用 Llama 3.1 和 Qdrant 构建多语言医疗保健聊天机器人的步骤
  • 【CSS in Depth 2 精译_040】6.3 CSS 定位技术之:相对定位(下)—— 用纯 CSS 绘制一个三角形
  • 使用激光定高需要注意的问题以及效果测试与读取
  • 栈:只允许在一端进行插入或删除操作的线性表
  • 王道-计网
  • HTML讲解(三)通用部分
  • 音频编码:PCM【无损音频】
  • 如何保证Redis与数据库的数据一致性
  • 《程序猿之Redis缓存实战 · 字符串类型》
  • 浅谈网络通信中的透传和非透传
  • 01---java面试八股文——springboot---10题
  • rsync+inotify
  • 【KVM】虚拟化技术及实战
  • defineExpose 显式导出子组件方法
  • 基于SSM的宠物领养管理系统的设计与实现 (含源码+sql+视频导入教程+文档+PPT)