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的规则

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

    <要执行的命令>

    mak 复制代码
    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. 基本写法

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

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

  • 大家应该会很奇怪,前面都说cmake好了,要学习,为什么就讲了这么点内容,我觉得学习这些基础的框架就够了,其它的依靠大模型的帮助会更有性价比。这里可能大家觉得我有些双标,我觉得工具的魅力是它的底蕴,是需要了解它,但是真正用到实际的时候,还是好的漂亮的代码最棒。大模型的代码比大部分写的代码都要合理,因为其训练数据种包含着拥有无数高质量代码的github。
相关推荐
Murphy20235 分钟前
.net4.0 调用API(form-data)上传文件及传参
开发语言·c#·api·httpwebrequest·form-data·uploadfile·multipart/form-
我曾经是个程序员16 分钟前
C#Directory类文件夹基本操作大全
服务器·开发语言·c#
白云~️18 分钟前
uniappX 移动端单行/多行文字隐藏显示省略号
开发语言·前端·javascript
编码浪子23 分钟前
构建一个rust生产应用读书笔记7-确认邮件2
开发语言·后端·rust
天之涯上上39 分钟前
JAVA开发 在 Spring Boot 中集成 Swagger
java·开发语言·spring boot
2402_8575834940 分钟前
“协同过滤技术实战”:网上书城系统的设计与实现
java·开发语言·vue.js·科技·mfc
爱学习的白杨树1 小时前
MyBatis的一级、二级缓存
java·开发语言·spring
OTWOL1 小时前
两道数组有关的OJ练习题
c语言·开发语言·数据结构·c++·算法
问道飞鱼1 小时前
【前端知识】强大的js动画组件anime.js
开发语言·前端·javascript·anime.js
拓端研究室1 小时前
R基于贝叶斯加法回归树BART、MCMC的DLNM分布滞后非线性模型分析母婴PM2.5暴露与出生体重数据及GAM模型对比、关键窗口识别
android·开发语言·kotlin