大型项目都会使用到的Makefile

news2025/2/2 14:51:19

一、vi编辑器之神

1.vi编辑器的三种模式:

插入模式:可以编辑文档

编辑模式:可以敲一些命令,执行例如复制n行 剪切n行 ,粘贴等功能

命令模式:(最后一行模式)

在此模式下可以保存文件,退出vi等

2.vi的三种模式之间的切换:

由编辑模式进去插入模式,按a i o这几个字母

由插入模式进入编辑模式,按ESC键

只能由编辑模式才能进入最后一行模式,在编辑模式下按shift : 进入最后一行模式

3.在最后一行模式下的命令

:w   保存文件

:wq 保存文件并退出

:x    保存文件并退出

:q!   不保存文件,强制退出vi

:w filrname 另存为filename

总结:

由插入模式或命令模式(最后一行模式)进入编辑模式  方法是按ESC键

由编辑模式进命令模式(最后一行模式)按shift:

由编辑模式进插入模式  按 a  i  o

插入模式和命令模式(最后一行模式)不能直接切换

4.编辑模式下的操作:

   u 撤销前面多次修改, ctrl   r 反撤销

   [n]x  删除光标前n个字符    3x

   [n]X 删除光标前n个字符     6X

   [n]dd删除从当前行开始的n行  4dd

   [n]yy复制从当前行开始的n行 4yy

    p把粘贴板上的内容插入当前行

    .执行上一次操作

     shift +zz(按住shift按两下z键保存退出当前文件

5.编辑器模式下的光标移动

         [n]G:将光标定位到第n行开始处

        5G:将光标移动到第5行开始处

        G:将光标定位到文件结束处

        gg:将光标定位到文件开始处

6.编辑模式下查找:

        /字符串:从光标开始处向文件尾查找字符串

        n:同一方向重复上一次查找命令

        N:反方向重复上一次查找命令

二、Makefile

1.什么是make?

make 是个命令,是个可执行程序,用来解析Makefile文件的命令

2.什么是makefile?

makefile是个文件,这个文件中描述了咱们程序的编译规则

咱们执行make命令的时候,make命令会在当前目录下找makefile文件

根据makefile文件里的规则,编译咱们程序

注意:Makefile规则文件是咱们程序员根据自己的程序,编写的编译规则

3.采用Makefile的好处

  • 简化编译程序的时候输出的命令,编译的时候只需要敲make命令就可以了
  • 可以节省编译的时间,提高编译效率。(通过make编译过一次后,当你下次再编译的时候,只会编译修改过时间戳的文件,没有修改的文件不会重新编译)

4.make的概述

  • GNU make是一种代码工具
  • make工具会根据makefile文件定义的规则和步骤,完成整个项目的代码维护工作
  • 一般用来简化编译工作,可以极大地提高软件开发的效率
  • windows下一般由集成开发环境自动生成
  • linux需要由我们按照其语法自己编写

    make主要解决两个问题:

  • 大量代码的关系维护

        大项目中源码比较多,手工维护,编译时间长而且编译命令复杂,难以记忆及维护

        把代码维护命令写在makefile文件中,然后再用make工具解析此文件自动执行相应命令,可实现代码的合理编译

  • 减少重复编译时间

        在改动其中一个文件的时候,能判断哪些文件被修改过,可以只对该文件进行重新编译,然后重新链接所有的目标文件,节省编译时间。

5.makefile语法及其执行

目标:依赖文件列表

<Tab>命令列表

01.目标

        通常是要产生的文件名称,目标可以是可执行文件或其他obj文件,也可以是一个动作的名称

02.依赖文件

        是用来输入从而产生目标的文件

        一个目标通常有几个依赖文件(可以没有)

03.命令:

        make执行的动作,一个规则可以包含几个命令(可以没有)

        有多个命令时,每个命令占一行

简单示例:

make命令格式:

make [-f file] [targets]
  • [-f file]:

        make默认在工作目录路径中寻找FGNUmakefile、makefile、Makefile的文件作为makefile输入文件,-f可以指定以上名字以外的文件作为makefile上输入文件。

  • [targets]

        若使用make命令时没有指定目标,则make工具默认会实现makefile文件内的第一个目标,然后退出

        指定了make工具要实现的目标,目标可以是一个或多个(多个目标间用 空格隔开)。

        一般使用的时候直接make就可以

6.Makefile案例:

  • main.c
#include "head.h"

int main(int argc,const char *argv[])
{
    int x = 1000;
    int y = 900;

    printf("%d + %d = %d\n",x,y,sum(x,y));
    printf("%d + %d = %d\n",x,y,sub(x,y));

    return 0;
}
  • head.h
#ifndef _HEAD_H_
#define _HEAD_H_

#include<stdio.h>

int sum(int a,int b);
int sub(int a,int b);

#endif
  • sum.c
#include "head.h"

int sum(int a,int b)
{
    return a + b;
}
  • sub.c
#include "head.h"

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

模拟多文件编程,基本上一个文件一个功能.如果没有makefile可以使用gcc *.c进行编译,但是如果工程特别大,编译全部文件就会很浪费时间。采用makfile可以提高效率.

  • makefile
main:main.o sub.o sum.o
    gcc main.o sub.o sum.o -o main

main.o:main.c
    gcc -c main.c -o main.o
sub.o:sub.c
    gcc -c sub.c -o sub.o
sum.o:sum.c
    gcc -c sum.c -o sum.o

clean:
    rm *.o main a.out -rf
  • make编译

 7.假想目标

前面makefile中出现的文件称之为假想目标

假想目标并 不是一个真正的文件名,通常是一个目标集合或者动作

可以没有依赖或者命令

一般需要显示的使用make+名字 显示调用

        all:exec1 exec2

        clean:

        <Tab>rm *.o exec

运行时使用make clean就会执行clean后面的命令

8.makefile变量概述

makefile变量类似于C语言中的宏,当makefile被make工具解析时,其中的变量会被展开。

变量的作用:

        保存文件名列表

        保存文件目录列表

        保存编译器名

        保存编译参数

        保存编译的输出

9.makefile的 变量分类

01.自定义变量

定义变量:

        变量名=变量值

引用变量:

        $(变量名)或${变量名}

makefile的变量名可以以数字开头:

注意:变量还是大小写敏感的

           变量一般都在makefile的头部定义

            变量几乎可在makefile的任何地方使用

如何编写自定义变量:

在makefile中可以用“#”注释

采用自定义变量后的makefile文件

 编译结果:

02系统环境变量

make工具会拷贝系统的环境变量并设置为makefile的变量,在makefile中可直接读取或修改拷贝后的变量。

#export test=10

#make clean

#echo $test

main:main.c main.h
    gcc main.c -o main
clean:
    rm main -rf
    echo $(PWD)
    echo "test=$(test)"

03预定义变量

makefile中有许多预定义变量,这些变量具有其特殊的含义,可在makefile中直接使用

        $@             目标名

        $<               依赖文件列表中的第一个文件

        $^               依赖文件列表中除去重复文件的部分

        AR                归档维护程序的程序名,默认值为ar

        ARFLAGS     归档维护程序的选项

        CC                 C编译器的名称,默认值为cc

        CFLAGS        C编译器的选项

        CPP               C预编译器的名称,默认值为$(CC) -E

        CPPFLAGS    C预编译器的选项

        CXX                C++编译器的名称,默认值为g++

        CXXFLAGS    C++编译器的选项

采用预定义变量后的makefile文件

编译结果 

04 最精简版的makefile

 编译结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/104032.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第03讲:Redis的持久化方案

前言 redis是一个内存数据库&#xff0c;当redis服务器重启&#xff0c;获取电脑重启&#xff0c;数据会丢失&#xff0c;我们可以将redis内存中的数据持久化保存到硬盘的文件中。 redis提供两种持久化方式: RDB&#xff1a;快照&#xff0c;通过从服务器保存和持久化AOF&…

Codeforces Round #839 (Div. 3) A~G all answer

Dashboard - Codeforces Round #839 (Div. 3) - Codeforces 最近状态奇差无比&#xff0c;还有点生病&#xff0c;低烧反复横跳&#xff0c;应该没阳&#xff1f;&#xff08;虽然家人都阳了&#xff0c;就剩我一个了wuwuwu&#xff5e;&#xff08;A B C就不作解释了&#xff…

【小5聊】Python3 使用selenium模块实现简单爬虫系列一

第一次听说Python还是在工作的时候&#xff0c;还是一位女生在用&#xff0c;当时她说可以用来处理excel文档&#xff0c;特别是一些统计分析。第二次让我真正进入python世界&#xff0c;还是在一次C站举办的大赛上。聊聊你是因为什么机缘巧合进入到python圈的呢&#xff1f;不…

金盾杯2022-AGCTFS战队 wp

文章目录Web图书馆EzPHPeZphp2SQLSkip有来无回反败为胜Crypto小菜一碟RRSSAAsimpleRrandMISC盗梦空间qianda0_Sudoku数据泄露01-账号泄露追踪数据泄露02-泄露的密码数据泄露03-泄露的密钥ReverseTeaPwnLoginWtfWeb 图书馆 根据提示找到 干货&#xff5c;最全的Tomcat漏洞复现…

Qt5 网页标题、关键词提取工具Findyou

Qt5 网页标题、关键词提取工具Findyou 一、程序运行 运行界面 辅助功能&#xff0c;可用于将扫描器的扫描结果转换为url 二、所涉及的重要知识点 1、Qt爬取https的网页 来自宇龍_ https://blog.csdn.net/qq_45809384/article/details/122049295?spm1001.2014.3001.5506 打…

Foxmail客户端添加163账号和邮件备份163邮箱

文章目录一、Foxmail添加163账号1. 点击图标2. 账号管理3. 新建4. 手动设置5. 填写信息6. 创建二、邮件转移备份2.1. 邮件折叠2.2. 选择目标邮箱2.3. 同步服务端Foxmail客户端添加163账号的具体步骤如下&#xff1a;一、Foxmail添加163账号 1. 点击图标 首先打开Foxmail客户端…

51寻找数组中出现次数超一半的数

51寻找数组中出现次数超一半的数 一看题目就想用hash表&#xff0c;但是要求空间复杂度为1&#xff0c;说明不可以用哈希表去存。一直在原地数组上思考&#xff0c;类似桶排序&#xff0c;可是这取决于数值的大小&#xff0c;最后还是看了题解&#xff0c;学到了。 思想是&…

外汇天眼:一笔赚了12600美元 你羡慕吗?

在外汇投资中&#xff0c;黑平台一直是外汇投资圈的一枚毒瘤&#xff0c;不能顺利出金也是外汇投资面临的最大风险之一。 对于外汇投资者而言&#xff0c;外汇交易平台的选择至关重要。 选择好的外汇交易平台&#xff0c;最重要的是&#xff1a;选择安全可靠的平台&#xff0…

Blackmagic黑魔法摄像机braw视频帧损坏文件修复方法

Blackmagic是全球知名的影视级产品供应商&#xff0c;其高清摄像机是国内外各种剧组的最爱。Blackmagic的新产品目前使用braw格式&#xff0c;其编码采用自定义的raw编码&#xff0c;视频的效果和阿莱不相上下。之前我们已经多次介绍过这种braw文件的修复&#xff0c;近期我们处…

grpc的使用

GRPC学习 本文包括grpc的入门使用和四种实现方式 文章目录一、GRPC 安装和hello world1、什么是GRPC2、安装grpc和代码3、服务端3.1、取出 server3.2、挂载方法3.3、注册服务3.4、创建监听4、客户端二、protobuf语法三、GRPC server 的使用1、普通服务2、流式传入&#xff08;客…

通达信破解接口怎么委托下单?

通达信破解接口主要是利用数学公式建立模型&#xff0c;通过大量数据判断未来价格走势&#xff0c;通过程序选股。虽然选股也比较广泛&#xff0c;但也能覆盖A股市场的四千多只股票&#xff0c;能排除强行涨跌等人为因素&#xff0c;执行的纪律性强。所以对于通达信破解接口对股…

【笔记】git 修改之前的提交记录信息(git commit -m ‘...‘)

文章目录一、修改最后一条提交记录信息二、修改前面某条或某几条提交记录信息一、修改最后一条提交记录信息 git commit --amend进入vi编辑器后&#xff1a; 按i下方出现’- - 插入 - -‘的提示时&#xff0c;便可编辑提交记录信息按ESC&#xff0c;输入:wq保存退出&#xff0…

ICG衍生物ICG-Sulfo-OSu的产品描述及保存建议

中文名称 ICG-Sulfo-OSu 英文名字 ICG-Sulfo-OSu 凯新生物描述: &#xff08;ICG&#xff09;是一种用于医学诊断的菁染料它用于测定心输出量、肝功能和肝血流&#xff0c;以及眼科血管造影它的峰值光谱吸收接近800 nm这些红外频率穿透视网膜层&#xff0c;使ICG血管造影能够比…

【STA】(2)概念

目录 1.CMOS逻辑设计 1.1 基本MOS结构 1.2 COMS逻辑门 1.3 标准单元 2.CMOS单元建模 3.电平翻转波形 4.传播延迟 5.波形的转换率 6.信号之间的偏移 7. 时序弧和单调性 8.最小和最大时序路径 9.时钟域 10.工作条件 1.CMOS逻辑设计 1.1 基本MOS结构 MOS(Metal Oxide…

2022年Python笔试选择题及答案(秋招)

2022年Python笔试选择题及答案&#xff08;秋招&#xff09; &#x1f3e0;个人主页&#xff1a;编程ID &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是编程ID&#xff0c;一个想要与大家共同进步的程序员儿 &#x1f9d1;如果各位哥哥姐姐在准备面试&#xff0c;找…

【Redis-11】Redis事务实现原理

Redis通过MULTI、EXEC、WATCH等命令来实现事务的功能&#xff0c;事务提供了一种将多个命令请求打包&#xff0c;然后一次性&#xff0c;顺序性的执行多个命令的机制。在事务执行期间&#xff0c;服务器不会中断事务去执行其他客户端的命令&#xff0c;他会讲事务中所有命令执行…

谈主成分分析/因子分析中的特征值“矩阵近似”

主成分分析和因子分析是数据降维的常用手段&#xff0c;其中以特征值为载体&#xff0c;在不断降维“近似”原本的协方差矩阵。 CSDN中一些文章在介绍这个问题或者叫“特征值分解”时&#xff0c;讲得都比较学术化&#xff0c;今天用一个小例子&#xff0c;还是面向新人&#…

Redis高可用之哨兵机制实现细节

Redis高可用之哨兵机制实现细节 本文来自我的 technotes [1] Redis篇&#xff0c;欢迎你常来逛逛。 正文 在上一篇的文章《Redis高可用全景一览》中&#xff0c;我们学习了 Redis 的高可用性。高可用性有两方面含义&#xff1a;一是服务少中断&#xff0c;二是数据少丢失。主…

【树莓派不吃灰】兄弟连篇⑥ Linux系统进程管理

目录1、进程查看1.1 ps1.2 top1.3 pstree2、终止进程2.1 kill2.2 killall2.3 pkill3、工作管理4、系统资源查看4.1 vmstat 监控系统资源4.2 dmesg 开机内核检测信息4.3 free 查看内存使用4.4 查看cpu信息4.5 uptime4.6 uname4.7 判断当前系统位数4.8 查询当前linux发行版本4.9 …

Windows及Kail安装配置

apache在kali环境搭建 Kali虚拟机中是包含有Apache的&#xff0c;在/etc目录下ls即可显示出来&#xff0c; 所以这里只需要进行配置就可以了。 图1.1 Apache2目录 打开Apache服务&#xff0c;开启后可以使用status命令查看服务状态。 /etc/init.d/apache2 start /etc/init.d…