【Linux开发技术之程序构建】Makefile学习(不断更新)

简介:

1.入门篇

1)Makefile的作用:帮助编译多文件。

2)基本编写示例:以如下四个文件为例

//main.c

#include"mytool1.h"
#include"mytool2.h"
int main(int argc,char **argv)
{
mytool1_print("hello");
mytool2_print("hello");
}

//mytool1.h
#ifndef _MYTOOL_1_H
#define _MYTOOL_1_H
void mytool1_print(char *print_str);
#endif

//mytool1.c
#include"mytool1.h"
void mytool1_print(char *print_str)
{
printf("This is mytool1 print %s",print_str);
}

//mytool2.h
#ifndef _MYTOOL_2_H
#define _MYTOOL_2_H
void mytool2_print(char *print_str);
#endif

//mytool2.c
#include"mytool2.h"
void mytool2_print(char *print_str)
{
printf("This is mytool2 print %s",print_str);
} 

对应进行编译构建的Makefile为

main:main.o mytool1.o mytool2.o

	gcc -o main main.o mytool1.o mytool2.o

main.o:main.c mytool1.h mytool2.h

	gcc -c main.c

mytool1.o:mytool1.c mytool1.h

	gcc -c mytool1.c

mytool2.o:mytool2.c mytool2.h

	gcc -c mytool2.c

Makefile 的本质是参与构建的源代码之间依赖关系和编译方法进行说明。一般采用的格式如下:

target: components
TAB rule

第一行表示的是依赖关系. 第二行是规则,使用TAB 键进行

main:main.o mytool1.o mytool2.o 就是所谓的依赖关系,实际上是一种庖丁解牛的方式,建议在纸上画好关系依赖图,如本例:

main
---main.o--(main.c,mytool1.h,mytool2.h)
|
mytool2.o--(mytool2.c,mytool2.h)
|
mytool1.o--(mytool1.c,mytool1.h)

而gcc -o main main.o mytool1.o mytool2.o 就是所谓的规则。

3)简化

$@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件,使用替代规则可以简写上例如下:

main:main.o mytool1.o mytool2.o
	gcc -o $@ $^

main.o:main.c mytool1.h mytool2.h
	gcc -c $<

mytool1.o:mytool1.cmytool1.h
	gcc -c $<

mytool2.o:mytool2.cmytool2.h
	gcc -c $<

如果有规律的命名规则,则可以简写上例如下:

main:main.o mytool1.o mytool2.o
	gcc -o $@ $^
..c.o:
	gcc -c $<

本文转自gnuhpc博客园博客,原文链接http://www.cnblogs.com/gnuhpc/archive/2012/01/07/2316090.html,如需转载请自行联系原作者
相关文章
|
12月前
|
安全 Linux iOS开发
Nessus Professional 10.10 Auto Installer for RHEL 10, AlmaLinux 10, Rocky Linux 10 - Nessus 自动化安装程序
Nessus Professional 10.10 Auto Installer for RHEL 10, AlmaLinux 10, Rocky Linux 10 - Nessus 自动化安装程序
820 6
Nessus Professional 10.10 Auto Installer for RHEL 10, AlmaLinux 10, Rocky Linux 10 - Nessus 自动化安装程序
|
JavaScript Linux 网络安全
Termux安卓终端美化与开发实战:从下载到插件优化,小白也能玩转Linux
Termux是一款安卓平台上的开源终端模拟器,支持apt包管理、SSH连接及Python/Node.js/C++开发环境搭建,被誉为“手机上的Linux系统”。其特点包括零ROOT权限、跨平台开发和强大扩展性。本文详细介绍其安装准备、基础与高级环境配置、必备插件推荐、常见问题解决方法以及延伸学习资源,帮助用户充分利用Termux进行开发与学习。适用于Android 7+设备,原创内容转载请注明来源。
6889 77
|
安全 Linux 编译器
探索Linux内核的奥秘:从零构建操作系统####
本文旨在通过深入浅出的方式,带领读者踏上一段从零开始构建简化版Linux操作系统的旅程。我们将避开复杂的技术细节,以通俗易懂的语言,逐步揭开Linux内核的神秘面纱,探讨其工作原理、核心组件及如何通过实践加深理解。这既是一次对操作系统原理的深刻洞察,也是一场激发创新思维与实践能力的冒险。 ####
|
Ubuntu 搜索推荐 Linux
详解Ubuntu的strings与grep命令:Linux开发的实用工具。
这就是Ubuntu中的strings和grep命令,透明且强大。我希望你喜欢这个神奇的世界,并能在你的Linux开发旅程上,通过它们找到你的方向。记住,你的电脑是你的舞台,在上面你可以做任何你想做的事,只要你敢于尝试。
676 32
|
Linux
在线对Linux进行磁盘扩容的技术指南。
综上所述,Linux磁盘扩容的过程,重要的不仅是技术,更是对每一步骤的深刻理解和投入的爱心。只要手握正确的工具,我们不仅能满足"孩子"的成长需求,还能享受其中的乐趣和成就。
925 10
|
安全 大数据 Linux
云上体验最佳的服务器操作系统 - Alibaba Cloud Linux | 飞天技术沙龙-CentOS 迁移替换专场
本次方案的主题是云上体验最佳的服务器操作系统 - Alibaba Cloud Linux ,从 Alibaba Cloud Linux 的产生背景、产品优势以及云上用户使用它享受的技术红利等方面详细进行了介绍。同时,通过国内某社交平台、某快递企业、某手机客户大数据业务 3 大案例,成功助力客户实现弹性扩容能力提升、性能提升、降本增效。 1. 背景介绍 2. 产品介绍 3. 案例分享
625 1
|
安全 Linux KVM
Linux虚拟化技术:从Xen到KVM
Xen和KVM是Linux平台上两种主要的虚拟化技术,各有优缺点和适用场景。通过对比两者的架构、性能、安全性、管理复杂性和硬件依赖性,可以更好地理解它们的适用场景和选择依据。无论是高性能计算、企业虚拟化还是云计算平台,合理选择和配置虚拟化技术是实现高效、稳定和安全IT环境的关键。
1363 8
|
Prometheus 运维 监控
Prometheus+Grafana+NodeExporter:构建出色的Linux监控解决方案,让你的运维更轻松
本文介绍如何使用 Prometheus + Grafana + Node Exporter 搭建 Linux 主机监控系统。Prometheus 负责收集和存储指标数据,Grafana 用于可视化展示,Node Exporter 则采集主机的性能数据。通过 Docker 容器化部署,简化安装配置过程。完成安装后,配置 Prometheus 抓取节点数据,并在 Grafana 中添加数据源及导入仪表盘模板,实现对 Linux 主机的全面监控。整个过程简单易行,帮助运维人员轻松掌握系统状态。
2730 3
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
1129 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库