”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 理解Makefile(以C语言为例)。

理解Makefile(以C语言为例)。

发布于2024-07-31
浏览:435

Comprendre le Makefile (Exemple avec langage C).

Makefile 是 make 工具用来自动编译程序的文件。以下是编写有效 Makefile 的标准规则和最佳实践:

Makefile 的基本结构

  1. 目标:您想要构建的内容(例如可执行文件)。
  2. 先决条件:构建目标所需的文件(例如源文件)。
  3. 规则:创建目标时执行的命令。

简单的例子

target: prerequisites
    command

标准规则

  1. 默认规则:Makefile 中的第一个目标是默认构建的目标。

  2. 编译源文件:

    • 使用编译器和选项的变量。
    • 例子 :
   CC = gcc
   CFLAGS = -Wall -g
   SOURCES = main.c utils.c
   OBJECTS = $(SOURCES:.c=.o)
   TARGET = mon_programme

   $(TARGET): $(OBJECTS)
       $(CC) -o $@ $^

   %.o: %.c
       $(CC) $(CFLAGS) -c $



  1. Phonies:对非文件目标使用 .PHONY。
   .PHONY: clean
   clean:
       rm -f $(OBJECTS) $(TARGET)
  1. 变量:使用变量来简化路径和选项的管理。
   CC = gcc
   CFLAGS = -Wall
  1. 依赖管理:使用隐式规则和模式来减少重复。

  2. 自动依赖关系:可以为.o文件自动生成依赖关系。

   -include $(OBJECTS:.o=.d)

完整示例

这是一个完整的Makefile示例:

# Variables
CC = gcc
CFLAGS = -Wall -g
SOURCES = main.c utils.c
OBJECTS = $(SOURCES:.c=.o)
TARGET = mon_programme

# Règle par défaut
all: $(TARGET)

# Lien de l'exécutable
# $@ -> $(TARGET)
# $^ -> $(OBJECTS)
$(TARGET): $(OBJECTS)
    $(CC) -o $@ $^

# Compilation des fichiers .c en .o
# $ Premier element des pr
%.o: %.c
    $(CC) $(CFLAGS) -c $



良好做法

  1. 用制表符缩进:规则中的命令必须用制表符缩进,而不是空格。

  2. 注释代码:使用注释来解释 Makefile 的各个部分。

  3. 分组文件:如果您的项目包含多个文件,请将它们组织到子目录中并使用变量来管理路径。

  4. 使用隐式规则:利用make的内置规则,避免重写公共规则。

为什么使用.PHONY?

  • 避免冲突:如果存在与目标同名的文件,make会认为目标是最新的,不会执行关联的命令。 .PHONY 避免了这种情况。

  • 性能改进: 虚假目标始终被视为“待办事项”,这可能会提高关联命令的执行速度。

为什么要使用%.o:%c进行编译?

  • 效率:使用 %.o:%c 可以让您受益于 make 优化,只重新编译必要的内容。

  • 实用:对于较大的项目,%.o:%c 更合适。

结论

结构良好的 Makefile 使项目管理更加容易并避免编译错误。通过遵循这些规则和最佳实践,您可以创建高效且可维护的 Makefile。

版本声明 本文转载于:https://dev.to/ashcript/comprendre-le-makefile-exemple-avec-le-langage-c-47n9如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何避免Go语言切片时的内存泄漏?
    如何避免Go语言切片时的内存泄漏?
    ,a [j:] ...虽然通常有效,但如果使用指针,可能会导致内存泄漏。这是因为原始的备份阵列保持完整,这意味着新切片外部指针引用的任何对象仍然可能占据内存。 copy(a [i:] 对于k,n:= len(a)-j i,len(a); k
    编程 发布于2025-04-16
  • 在Python中如何创建动态变量?
    在Python中如何创建动态变量?
    在Python 中,动态创建变量的功能可以是一种强大的工具,尤其是在使用复杂的数据结构或算法时,Dynamic Variable Creation的动态变量创建。 Python提供了几种创造性的方法来实现这一目标。利用dictionaries 一种有效的方法是利用字典。字典允许您动态创建密钥并分...
    编程 发布于2025-04-16
  • 如何使用node-mysql在单个查询中执行多个SQL语句?
    如何使用node-mysql在单个查询中执行多个SQL语句?
    Multi-Statement Query Support in Node-MySQLIn Node.js, the question arises when executing multiple SQL statements in a single query using the node-mys...
    编程 发布于2025-04-16
  • 三.js加载本地3D模型时为何报“跨域请求仅支持HTTP”错误?
    三.js加载本地3D模型时为何报“跨域请求仅支持HTTP”错误?
    在three.js中加载错误:“仅支持HTTP”的Cross Origin请求“ 尝试将本地的3D模型合并到您的三个.js应用程序中时,使用JSONLOADER,您可能会遇到“ Cross fors fors fors”。由于模型的位置与Web浏览器所采用的HTTP协议之间的差异。您的模型可能是使...
    编程 发布于2025-04-16
  • 如何使用组在MySQL中旋转数据?
    如何使用组在MySQL中旋转数据?
    在关系数据库中使用mySQL组使用mySQL组进行查询结果,在关系数据库中使用MySQL组,转移数据的数据是指重新排列的行和列的重排以增强数据可视化。在这里,我们面对一个共同的挑战:使用组的组将数据从基于行的基于列的转换为基于列。 Let's consider the following ...
    编程 发布于2025-04-16
  • 如何使用Depimal.parse()中的指数表示法中的数字?
    如何使用Depimal.parse()中的指数表示法中的数字?
    在尝试使用Decimal.parse(“ 1.2345e-02”中的指数符号表示法表示的字符串时,您可能会遇到错误。这是因为默认解析方法无法识别指数符号。 成功解析这样的字符串,您需要明确指定它代表浮点数。您可以使用numbersTyles.Float样式进行此操作,如下所示:[&& && && ...
    编程 发布于2025-04-16
  • PHP数据库迁移管理技巧
    PHP数据库迁移管理技巧
    [2 如何管理PHP 中的数据库迁移 数据库迁移是应用程序开发的重要组成部分,因为它们允许开发人员以一致且结构化的方式对数据库架构进行版本控制和管理更改。在PHP中,可以手动进行管理数据库迁移,但是使用自动化该过程的迁移工具更有效且易于错误。迁移工具提供了一种有组织的方法来处理模式更...
    编程 发布于2025-04-16
  • 哪种方法更有效地用于点 - 填点检测:射线跟踪或matplotlib \的路径contains_points?
    哪种方法更有效地用于点 - 填点检测:射线跟踪或matplotlib \的路径contains_points?
    在Python Matplotlib's path.contains_points FunctionMatplotlib's path.contains_points function employs a path object to represent the polygon.它...
    编程 发布于2025-04-16
  • 您可以使用CSS在Chrome和Firefox中染色控制台输出吗?
    您可以使用CSS在Chrome和Firefox中染色控制台输出吗?
    在javascript console 中显示颜色是可以使用chrome的控制台显示彩色文本,例如红色的redors,for for for for错误消息?回答是的,可以使用CSS将颜色添加到Chrome和Firefox中的控制台显示的消息(版本31或更高版本)中。要实现这一目标,请使用以下模...
    编程 发布于2025-04-16
  • 在Kubernetes上搭建MySQL并使用Prometheus和Grafana监控
    在Kubernetes上搭建MySQL并使用Prometheus和Grafana监控
    在本教程中,我们将详细介绍如何在Kubernetes(K8S)群集上设置MySQL,并集成Prometheus和Grafana进行监视。我们将使用MySQL,Prometheus和Grafana的Bitnami Helm图表,并向您展示如何创建自定义的Grafana仪表板来监视MySQL。 ...
    编程 发布于2025-04-16
  • Laravel Eloquent ORM 孟加拉语教程:生成模型类
    Laravel Eloquent ORM 孟加拉语教程:生成模型类
    是一个用Laravel中的数据库表创建模型类的过程。使用雄辩的ORM(对象相关映射器),您可以轻松地从数据库表中轻松读取,创建,更新和删除数据。 模型类方法 1。使用Artisan命令创建模型 模型类是使用Laravel的Artisan CLI创建的。在下面运行...
    编程 发布于2025-04-16
  • 现代C++中异常说明符是否仍有用?
    现代C++中异常说明符是否仍有用?
    我应该在C?While these specifiers can convey intent, their practical use is questionable due to several factors:Limitations in Enforcementvoid foo() throw...
    编程 发布于2025-04-16
  • AWS RDS与Spring Boot连接指南
    AWS RDS与Spring Boot连接指南
    介绍 在本文中,我将介绍配置安全组并将其连接到您的Spring Boot应用程序并测试连接后设置AWS RDS MySQL实例的过程。 步骤1:创建一个新的安全组 在设置RDS实例之前,您需要确保该实例可访问。您可以通过配置AWS 安全组来做到这一点。安全组充当一个...
    编程 发布于2025-04-16
  • 如何解决由于Android的内容安全策略而拒绝加载脚本... \”错误?
    如何解决由于Android的内容安全策略而拒绝加载脚本... \”错误?
    Unveiling the Mystery: Content Security Policy Directive ErrorsEncountering the enigmatic error "Refused to load the script..." when deployi...
    编程 发布于2025-04-16
  • 如何在JavaScript对象中动态设置键?
    如何在JavaScript对象中动态设置键?
    在尝试为JavaScript对象创建动态键时,如何使用此Syntax jsObj['key' i] = 'example' 1;不工作。正确的方法采用方括号: jsobj ['key''i] ='example'1; 在JavaScript中,数组是一...
    编程 发布于2025-04-16

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3