首页 > 其他分享 >编写Makefile文件语法,持续更新中~

编写Makefile文件语法,持续更新中~

时间:2024-03-13 17:31:44浏览次数:27  
标签:文件 路径 Makefile 语法 编译 编译器 编写 链接

一、什么是Makefile?

我们写大型项目时,会用到很多源文件,源文件在不同目录中的文件夹里包含着,一个一个编译起来很麻烦,makefile就能够方便我们编译链接。
使用makefile进行编译连接时会用到make命令,Makefile的会在执行make命令时指定编译和链接的规则,包括源代码文件之间的链接关系、依赖关系等。它关系到整个项目工程的编译规则:哪些文件需要先编译,哪些要后编译,哪些需要重新编译等复杂的操作。
另外,Makefile每次只会编译修改的和依赖于修改的那些文件,提高了编译效率。

二、编译链接过程

对于程序的编译,首先都需要将源代码文件编译成中间代码(Win下.ob文件,UNIXLINUX下. a文件),即Object文件,然后再将大量的Object文件链接在一起执行。
在编译时,编译器检查程序代码中语法的正确性,函数以及变量的声明是否正确,以及进行预处理(例如头文件的所在位置以及宏替换等),此步骤只要语法没有问题,编译就不会出错,便可以生成中间目标文件。
在链接时,主要是链接函数与全局变量,链接器不用管函数在哪一个源文件当中,它关心的是函数所在的中间目标文件。大多数情况下,编译生成的中间目标文件比较多,在链接时需要明确地指出中间目标名,这对于编译很不方便,解决方法是给中间目标文件打包生成一个库文件(Win下是.lib,UNIX/LINUX是.a)。
综上,编译链接的过程是:

  • 首先源文件会讲过编译阶段生成中间目标文件,再由中间目标文件生成执行文件。
  • 编译时编译器只检测程序的语法、函数,变量是否声明以及一些预处理。如果函数只是声明但是未实现则编译器只会警告(不是所有的编译器都是这样),仍然可以生成中间目标文件。
  • 在链接程序时,链接器会在所有的中间目标文件中寻找函数的实现,如果找不到,那就会提示链接错误。

三、实现简单的Makefile(生成单个可执行文件)

把你需要的目标文件,.o文件,.c文件如何实现的规则(指令)按照格式写进去就可以。

Makefile 赋值操作

:=是一种赋值操作符,称为“简单赋值”。它与其他赋值操作符(如=)不同的是,:=操作符用于在变量定义时立即展开右侧的内容,并将结果赋给左侧的变量。这样做可以确保变量在后续引用时具有确定的值,而不会受到后续环境变化的影响。

Makefile 内置函数 $(shell …)

App_SRC_Files := $(shell find app/ -type f -name '*.rs') $(shell find app/ -type f -name 'Cargo.toml')

这个函数的作用是在 Makefile 中执行 shell 命令,并将其输出作为函数的返回值。

find 命令:查找指定目录 (app/) 下的文件路径
-type 参数:f 表示只查找普通文件
-name 参数:分别指定了要查找的文件名模式为以 .rs 结尾的 Rust 源文件和名称为 Cargo.toml 的文件。

Makefile -I 指定包含路径

App_Include_Paths := -I ./app -I$(SGX_SDK)/include -I$(CUSTOM_EDL_PATH)

-I:指定包含路径(include,"包含路径"通常是指在编译程序时,编译器用于查找头文件的路径。在Makefile中设置正确的包含路径可以确保编译器能够找到所需的头文件,从而成功编译源代码。)
-I ./app 表示将当前目录下的 app 目录添加到包含路径中。
-I$(SGX_SDK)/include 表示将环境变量 SGX_SDK 指定的 SGX SDK 安装目录下的 include 目录添加到包含路径中。
-I$(CUSTOM_EDL_PATH) 表示将自定义环境变量 CUSTOM_EDL_PATH 指定的路径添加到包含路径中。

参考链接:

  1. http://t.csdnimg.cn/DCVBe

标签:文件,路径,Makefile,语法,编译,编译器,编写,链接
From: https://blog.csdn.net/weixin_63339973/article/details/136672753

相关文章

  • 用Go语言编写的轻量级Web服务器Caddy,一键在Ubuntu安装
    最近在阿贝云试用新的免费服务器,1核1G内存10G磁盘5M带宽,对于学习用还挺不错的。这次想给它试下轻量级Web服务器Caddy。Caddy采用Go编写,以运行简单和安全为目标。它内置HTTPS功能并支持多个后端,例如HTTP或FTP。相比Nginx功能更强大易用。下面来个步骤给Ubuntu服务器装Cadd......
  • c++基础语法
    文章目录前言命名空间命名空间的使用缺省参数缺省参数的使用函数重载函数重载的作用函数重载的使用函数重载原理引用引用的使用引用的使用场景引用和指针externCinlineauto范围fornullptr前言大家好我是jiantaoyab,这篇文章给大家带来的是c语言没有的一些特性之......
  • C语言救赎之路,有些鸟儿是困不住的(其三)。main+头文件+分支和循环语句(基本语法)
    前言:              在将之前先给大家分享个好玩的,这是我今天在课上的发生的。       今天老师在讲java与C语言主函数的都是什么开始的,老师让我们回答,不就是main吗?我突然想到什么?main?main?卧槽牢大!man!一口流利的洛杉矶口音的man随口而出。引来大家的wha......
  • 实验1 C语言输入输出和简单程序编写
    实验任务11_11#include<stdio.h>2intmain()3{4printf("O\n");5printf("<H>\n");6printf("II\n");78printf("O\n");9printf("<H>\n");10......
  • 实验1 C语言输入输出和简单程序编写
    1#include<stdio.h>usingnamespacestd;intmain(){ printf("O\n"); printf("<H>\n"); printf("II\n"); return0;}2#include<stdio.h>usingnamespacestd;intmain(){floata,b,c; scanf......
  • Python实战:变量命名规范:编写优雅代码的关键
    在Python编程中,变量命名规范对于编写优雅和可维护的代码至关重要。本文将深入探讨Python中的变量命名规则和最佳实践,包括命名约定、避免命名冲突以及命名中的注意事项。我们将通过具体的代码示例来展示如何遵循命名规范来编写优雅的代码,并理解命名规范在编程中的重要性。1.......
  • Python实战:Python注释:编写清晰程序说明书
    在Python编程中,注释是编写清晰程序说明书的最佳实践。本文将深入探讨Python中的注释,包括注释的类型、使用方法和最佳实践。我们将通过具体的代码示例来展示如何使用不同类型的注释来编写程序说明,并理解注释在编程中的重要性。1.注释简介注释是编程语言中用于解释代码的可......
  • springboot-yaml语法
    SpringBoot使用一个全局的配置文件,配置文件名称是固定的application.properties语法结构:key=valueserver.port=8080application.yml语法结构:key:空格value普通的key-valueserver:port:8080yaml后缀配置可以存储对象,而properties只能保存键值对yaml不仅可以用来......
  • scapy编写自定义协议
    编写自定义格式的步骤如下首先先定义一个类,把所有的字段标注下来,每个字段占用几个字节或者几个bit例子:我们这里需要构造一个trill协议的数据包,但是scapy没有对这个的支持,查看官方的协议手册https://www.rfc-editor.org/rfc/rfc6325.html#section-3.8classTRILL(Packet):......
  • MYSQL语法:左连接、右连接、内连接、全外连接
    概念leftjoin(左连接):返回包括左表中的所有记录和右表中连接字段相等的记录。rightjoin(右连接):返回包括右表中的所有记录和左表中连接字段相等的记录。innerjoin(内连接):只返回两个表中连接字段相等的行。fulljoin(全外连接):返回左右表中所有的记录和左右表中连接字段相等的记录......