Makefile基础 -- Unix学习总结之二

makefile学习 原文链接:https://blog.youkuaiyun.com/haoel/article/details/2886 跟我一起写 Makefile 陈皓 概述 —— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。特别在Unix下的软件编译,你就不能不自己写mak 阅读详情

先给出一个例子(来源于:《Unix Text Book》):

makefile文件
power : main.o input.o compute.o
 gcc $^ -o $@ -lm
main.o : main.c main.h input.h compute.h
 gcc -c main.c
input.o : input.c input.h
 gcc -c input.c
compute.o : compute.c compute.h
 gcc -c compute.c
程序代码:
1、compute.h
/*
Declaration/Prototype of the "computer" function
*/
double compute(double,double);

2、
/*
compute.c
*/
#include<math.H>
#include"compute.h"
double compute(double x,double y)
{
    return (pow((double)x,(double)y));
} 

3、
/*  input.h
Declaration/Prototype of the "input" function
*/
double input(char*);

4、
/*   input.c
*/
#include"input.h"
double input(char *s)
{
    float x;
    printf("%s",s);
    scanf("%f",&x);
    return x;
}
5、
/*  main.h
Declaration of prompts to users
*/
#define PROMPT1 "Enter the value of x : "
#define PROMPT2 "Enter the value of y : "

6、/*main.c*/
#include"main.h"
#include"compute.h"
#include"input.h"

main()
{
    double x,y;
    printf("The program takes x and y from stdin and displays x^y./n");
    x=input(PROMPT1);
    y=input(PROMPT2);
    printf("x^y is %6.3f/n",compute(x,y));
}

1.  GNU make -- 为什么要用makefile
在大型的开发项目中,通常有几十到上百个的源文件,如果每次均手工键入 gcc 命令进行编译的

话,则会非常不方便。因此,人们通常利用 make 工具来自动完成编译工作。这些工作包括:如果

仅修改了某几个源文件,则只重新编译这几个源文件;如果某个头文件被修改了,则重新编译所有

包含该头文件的源文件。利用这种自动编译可大大简化开发工作,避免不必要的重新编译。
实际上,make 工具通过一个称为 makefile 的文件来完成并自动维护编译工作。makefile 需要按

照某种语法进行编写,其中说明了如何编译各个源文件并连接生成可执行文件,并定义了源文件之

间的依赖关系.当修改了其中某个源文件时,如果其他源文件依赖于该文件,则也要重新编译所有

依赖该文件的源文件。
makefile 文件是许多编译器,包括 Windows NT 下的编译器维护编译信息的常用方法,只是在集

成开发环境中,用户通过友好的界面修改 makefile 文件而已。
默认情况下,GNU make 工具在当前工作目录中按如下顺序搜索 makefile:
* GNUmakefile
* makefile
* Makefile
在 UNIX 系统中,习惯使用 Makefile 作为 makfile 文件。如果要使用其他文件作为 makefile,

则可利用类似下面的 make 命令选项指定 makefile 文件:
$ make -f Makefile.debug

2.  makefile 基本结构
makefile 中一般包含如下内容:
* 需要由 make 工具创建的项目,通常是目标文件和可执行文件。通常使用“目标(target)”一

词来表示要创建的项目。
* 要创建的项目依赖于哪些文件。
* 创建每个项目时需要运行的命令。
例如,假设你现在有一个 C++ 源文件 test.C,该源文件包含有自定义的头文件 test.h,则目标

文件 test.o 明确依赖于两个源文件:test.C 和 test.h。另外,你可能只希望利用 g++ 命令来

生成 test.o 目标文件。
这时,就可以利用如下的 makefile 来定义 test.o 的创建规则:

# This makefile just is a example.
# The following lines indicate how test.o depends
# test.C and test.h, and how to create test.o

test.o: test.C test.h
    g++ -c -g test.C

从上面的例子注意到,第一个字符为 # 的行为注释行。第一个非注释行指定 test.o 为目标,并

且依赖于test.C 和 test.h 文件。随后的行指定了如何从目标所依赖的文件建立目标。
当 test.C 或 test.h 文件在编译之后又被修改,则 make 工具可自动重新编译 test.o,如果在

前后两次编译之间,test.C 和 test.h 均没有被修改,而且 test.o 还存在的话,就没有必要重

新编译。这种依赖关系在多源文件的程序编译中尤其重要。通过这种依赖关系的定义,make 工具

可避免许多不必要的编译工作。当然,利用 Shell 脚本也可以达到自动编译的效果,但是,Shell

脚本将全部编译任何源文件,包括哪些不必要重新编译的源文件,而 make 工具则可根据目标上一

次编译的时间和目标所依赖的源文件的更新时间而自动判断应当编译哪个源文件。
一个 makefile 文件中可定义多个目标,利用 make target 命令可指定要编译的目标,如果不指

定目标,则使用第一个目标。通常,makefile 中定义有 clean 目标,可用来清除编译过程中的中

间文件,例如:
clean:
    rm -f *.o
运行 make clean 时,将执行 rm -f *.o 命令,最终删除所有编译过程中产生的所有中间文件。

3. makefile 变量
GNU 的 make 工具除提供有建立目标的基本功能之外,还有许多便于表达依赖性关系以及建立目标

的命令的特色。其中之一就是变量或宏的定义能力。如果你要以相同的编译选项同时编译十几个 C

源文件,而为每个目标的编译指定冗长的编译选项的话,将是非常乏味的。但利用简单的变量定义

,可避免这种乏味的工作:

# Define macros for name of compiler
CC = gcc

# Define a macr o for the CC flags
CFLAGS = -D_DEBUG -g -m486

# A rule for building a object file
test.o: test.c test.h
    $(CC) -c $(CFLAGS) test.c

在上面的例子中,CC 和 CFLAGS 就是 make 的变量。GNU make 通常称之为变量,而其他 UNIX 的

make工具称之为宏,实际是同一个东西。在 makefile 中引用变量的值时,只需变量名之前添加 $

符号,如上面的 $(CC) 和 $(CFLAGS)。

4.  GNU make 的主要预定义变量
GNU make 有许多预定义的变量,这些变量具有特殊的含义,可在规则中使用。表 1-5 给出了一些

主要的预定义变量,除这些变量外,GNU make 还将所有的环境变量作为自己的预定义变量。

                        表 1-5  GNU make 的主要预定义变量
预定义变量                      含义
$*              不包含扩展名的目标文件名称。
$+              所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件

。
$<              第一个依赖文件的名称。
$?              所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚。
$@              目标的完整名称。
$^              所有的依赖文件,以空格分开,不包含重复的依赖文件。
$%              如果目标是归档成员,则该变量表示目标的归档成员名称。例如,如果目标名称
                为 mytarget.so(image.o),则 $@ 为 mytarget.so,而 $% 为 image.o。
AR              归档维护程序的名称,默认值为 ar。
ARFLAGS         归档维护程序的选项。
AS              汇编程序的名称,默认值为 as。
ASFLAGS         汇编程序的选项。
CC              C 编译器的名称,默认值为 cc。
CCFLAGS         C 编译器的选项。
CPP             C 预编译器的名称,默认值为 $(CC) -E。
CPPFLAGS        C 预编译的选项。
CXX             C++ 编译器的名称,默认值为 g++。
CXXFLAGS        C++ 编译器的选项。
FC              FORTRAN 编译器的名称,默认值为 f77。
FFLAGS          FORTRAN 编译器的选项。

5. 隐含规则
GNU make 包含有一些内置的或隐含的规则,这些规则定义了如何从不同的依赖文件建立特定类型

的目标。
GNU make 支持两种类型的隐含规则:
* 后缀规则(Suffix Rule)。后缀规则是定义隐含规则的老风格方法。后缀规则定义了将一个具

有某个后缀的文件(例如,.c 文件)转换为具有另外一种后缀的文件(例如,.o 文件)的方法。

每个后缀规则以两个成对出现的后缀名定义,例如,将 .c 文件转换为 .o 文件的后缀规则可定义

为:
.c.o:
$(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<

* 模式规则(pattern rules)。这种规则更加通用,因为可以利用模式规则定义更加复杂的依赖

性规则。模式规则看起来非常类似于正则规则,但在目标名称的前面多了一个 % 号,同时可用来

定义目标和依赖文件之间的关系,例如下面的模式规则定义了如何将任意一个 X.c 文件转换为

X.o 文件:

%.c:%.o
$(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<


6.  makefile 范例(如上例所示)

7.  运行 make
我们知道,直接在 make 命令的后面键入目标名可建立指定的目标,如果直接运行 make,则建立

第一个目标。我们还知道可以用 make -f mymakefile 这样的命令指定 make 使用特定的makefile

,而不是默认的 GNUmakefile、makefile 或 Makefile。但 GNU make 命令还有一些其他选项,表

1-6 给出了这些选项。

                        表 1-6  GNU make 命令的常用命令行选项

命令行选项              含义
-C DIR              在读取 makefile 之前改变到指定的目录 DIR。
-f FILE             以指定的 FILE 文件作为 makefile。
-h                  显示所有的 make 选项。
-i                  忽略所有的命令执行错误。
-I DIR              当包含其他 makefile 文件时,可利用该选项指定搜索目录。
-n                  只打印要执行的命令,但不执行这些命令。
-p                  显示 make 变量数据库和隐含规则。
-s                  在执行命令时不显示命令。
-w                  在处理 makefile 之前和之后,显示工作目录。
-W FILE             假定文件 FILE 已经被修改。

UNIX编程艺术:从基础到实践的全方位教程 UNIX哲学强调简洁、模块化和组合性。其核心思想之一是“每个程序只做一件事情,并做好它”,这使得UNIX系统中的工具小巧而高效,便于组合使用来处理复杂的任务。通过一系列简单的命令和工具,UNIX系统可以构建出强大的文本处理能力和灵活性。文本流是数据在UNIX系统中的一种表示方式,它将数据视为一个连续的数据流。这使得UNIX系统能够以相同的方式处理文件、键盘输入、打印输出以及网络通信等不同类型的数据。 阅读详情

相关推荐

gerrit 配置 ----Gitweb集成

此外,为了让用户能够查看任何关于 gitweb 的信息 项目中,用户必须能够阅读所有引用(包括 refs/meta/config,refs/meta/dashboards/*等)。或者,如果Gerrit通过反向代理送达,它可以 为gitweb的链接生成不同的URL(需要的) 在网页服务器上重写为)。Gerrit 代码审查可以管理和生成指向 gitweb 的超链接, 允许用户从Gerrit内容跳转到相同信息, 但由 gitweb 显示。默认为,这是 Linux 发行版上“gitweb”包的常见安装路径。

QuanQuanYuanXin的博客 1405

u-boot 2010.09 移植 (二)Makefile详解

<br />*这里先组织一些分析过程中产生的疑问与解答,待日后有时间再补充完整<br /> <br />1)三种变量声明方式<br />   =<br />   :=<br />   ?=<br /> <br />   =为递归式推导。只有当调用时才递归展开。则其值具有不稳定性。由于是递归,不能再引用自己。<br />   := 直接推导。和我们其他编程语言中的赋值相同,直接取得结果。不易产生岐意。(推荐使用)<br />   ?= 当该变量已被定义,则本行赋值语句不起作用。若该变量未定义,则定义该变量。u

HumorRat的专栏 3007

Cluster Computing投稿

在overleaf中新建picins.sty文件,该文件是导入的包在.tex文件中添加以下内容\usepackage{picins}%实现作者简介%下边这块有几个人复制几段\vspace{0\baselineskip} %这一行控制作者间隔,可视情况改数字!!!!!!!!

这里是萤石ym的学习路途,努力搬砖! 5535

Makefile的一些小技巧

有的时候,在公司里使用bsub跑项目需要和别人抢服务器资源,跑某个项目的时候需要license,而如果没有足够的license则会退出进程,如果可以在失败后立即重新提交任务则能在license被释放的第一时间抢到。linux系统里面定时执行某个脚本一般会使用crontab,但这是需要管理员权限的,公司的电脑不会给权限,退而求其次,使用makefile也是可以的,关键在于用好循环算法。这里的300指的是300秒,程序运行不到300秒则判定运行失败,再次发起任务!make run_all即可。

Kiliwaja的博客 452

【数学建模】编程手学习路线

在学习过程中,建议注重理论与实践相结合,多进行实例练习和项目实践,以巩固所学知识并提升实际应用能力。同时,保持对新技术和新方法的关注和学习,不断提升自己的专业素养和竞争力。NumPy、Pandas、Matplotlib和Seaborn等库是数据处理和可视化的重要工具。掌握常用机器学习算法的原理和应用,如决策树、支持向量机、神经网络等。学习内容包括微积分、线性方程组、矩阵运算、概率分布、统计推断等。学习内容包括基本语法、函数和模块、面向对象编程、文件操作等。深入了解优化理论和方法,如梯度下降法、牛顿法等。

2301_79586491的博客 2962

Lumerical官方案例、FDTD时域有限差分法仿真学习(三)——环形谐振器(Ring resonator)之第一部分

环形谐振器教程的第 1 部分使用 MODE 来设计和仿真环形谐振器。 自由光谱范围 (FSR) 和品质因数 (Q 因数) 是这种面向片上通信应用的基于绝缘体上硅 (SOI) 波导设计的关键性能指标。

weixin_45719141的博客 3万+

Makefile常用变量和规则备忘

10.3     隐含变量内嵌隐含规则的命令中,所使用的变量都是预定义的变量。我们将这些变量称为“隐含变量”。这些变量允许对它进行修改:在Makefile中、通过命令行参数或者设置系统环境变量的方式来对它进行重定义。无论是用那种方式,只要make在运行时它的定义有效,make的隐含规则都会使用这些变量。当然,也可以使用“-R

茂森的专栏 1247

【毕业设计】基于雷达与深度学习的摔倒检测——雷达数据集的建立

运动物体的微多普勒效应为人体动作识别提供了可能,基于雷达的居家检测具有良好的隐私保护性,且不易受环境因素影响(如光照、温度等),近年来已受到国内外学者的广泛关注。基于雷达与深度学习的摔倒检测使用自建的雷达数据集进行人体摔倒检测的研究。雷达数据集的建立分为雷达数据采集和雷达数据处理两部分工作。

洋洋Young的博客 3403

Makefile隐含规则

隐含规则————在我们使用Makefile时,有一些我们会经常使用,而且使用频率非常高的东西,比如,我们编译C/C++的源程序为中间目标文件(Unix下是[.o]文件,Windows下是[.obj]文件)。本章讲述的就是一些在Makefile中的“隐含的”,早先约定了的,不需要我们再写出来的规则。“隐含规则”也就是一种惯例,make会按照这种“惯例”心照不喧地来运行,那怕我们的Makefile中没

1189

AI自动化时代:一人公司的崛起与商业机会

AI技术正在重塑商业格局,催生"一人公司"创业新模式。这种轻资产、高效率的商业模式通过AI自动化运营,让个人创业者能以极低成本挑战传统企业。核心机会包括:1)AI自主公司替代人力密集型业务;2)为企业提供AI转型解决方案;3)利用AI工具实现个人创业。创业者需快速验证创意,聚焦人机协作,把握当前AI发展窗口期。未来,AI赋能的"一人公司"将成为商业新常态,带来更高的专业化和灵活性。抓住AI红利,学会人机协作,是个人创业成功的关键。

这里汇聚了前沿的技术分享与实用的开发技巧,带你探索从创意到企业的技术创业之路。 520

WorkBuddy CAD 审图救命课:约束、单位、尺寸链一次查清,打样前拦住返工

最危险的 CAD 文件不是打不开,而是看起来完整却混用了毫米与英寸、草图欠约束、关键尺寸没有来源。审图任务必须先列规则,再输出问题位置。 本课不会用“AI 一键完成”制造错觉,而是把 WorkBuddy、FreeCAD 0.21.2、OpenCascade 7.7 与人工审阅组成一条可复现链路。你会从“一份模拟 STEP 文件、参数表、装配基准与审图标准”出发,得到“单位报告、约束清单、尺寸链风险表与人工复核标记”,并学会用真实命令、错误信号和停止条件判断成果能不能进入下一阶段。

yueyeguzhuo的专栏 265

unix编程学习路线图

http://hi.baidu.com/tkblue/blog/item/98aef5cade45fb42f21fe795.html 建议学习路径:   首先先学学编辑器,vim, emacs什么的都行。 然后学make file文件,只要知道一点就行,这样就可以准备编程序了。   然后看看《C程序设计语言》K&R,这样呢,基本上就可以进行一般的编程了,顺便找本数据结构的书来看。

yake25的专栏 2609

am62x A53与R5F通信

AM62x是Ti的一款异构多核芯片。remoteproc驱动,硬编码(写死)了R5F/M4F固件的名字,这样驱动启动时,就会找硬件编码的固件,下面是其对应关系。值得注意的是,linux内核中的M4F remoteproc驱动启动M4F,而linux内核中的R5F remoreteproc驱动不启动R5F,相反,它attach到已经在boot阶段启动的R5F固件上。在/lib/firmware的真实固件名:,而我们生成的固件名如下所示,没有直接对应的,经确认,.out文件就是我们需要的,重命名后即可。

鹰之翔 1362

Makefile知识点整理

<br />Make指令是Unix&Linux下用于自动编译,打包,安装部署用的一个实用工具。它是每一位Unix&Linux程序员必须掌握的开发技巧之一。<br />还记得在Unix&Linux环境下,敲 make && make install 吗?<br />Makefile是Make运行时读取的配置文件。它描述了如何编译,生成目标程序及一些项目管理相关功能。<br />Make类似于Java开发环境里的 ant,maven。但通过Makefile描述,使它比ant, maven更具灵活性,功能也更强大

星星之火可以燎原 408

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

一篇文章全面掌握Makefile:从基础到高级用法

本文介绍了Linux/Unix环境下Makefile工具的基本概念和使用方法。Makefile通过定义目标-依赖关系和执行命令实现项目自动化构建,能够有效避免重复编译。文章详细讲解了Makefile的规则语法、变量定义、条件判断、函数使用等核心功能,包括伪目标、自动变量、字符串处理函数等实用特性。同时介绍了make命令的运行方式、隐含规则以及函数库文件的更新方法。最后给出了使用Makefile的最佳实践建议,强调变量化、模式化、文档化的重要性,并提供了帮助目标的实现示例。

weixin_44932366的博客 1098

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

学习linux/unix编程方法的建议

首先先学学编辑器,vim, emacs什么的都行。        然后学make file文件,只要知道一点就行,这样就可以准备编程序了。    然后看看《C程序设计语言》K&R,这样呢,基本上就可以进行一般的编程了,顺便找本数据结构的书来看。    如果想学习UNIX/LINUX的编程,《APUE》绝对经典的教材,加深一下功底,学习《UNP》的第二卷。这样基本上系统方面的就可以掌握了。

chtdsl 383

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【Windows/Linux】Makefile知识点整理 http://blog.163.com/niwei_258/blog/static/106284882010101485242891/

Make指令是Unix&Linux下用于自动编译,打包,安装部署用的一个实用工具。它是每一位Unix&Linux程序员必须掌握的开发技巧之一。 还记得在Unix&Linux环境下,敲 make && make install 吗? Makefile是Make运行时读取的配置文件。它描述了如何编译,生成目标程序及一些项目管理相关功能。 Make类似于Java开发环境里的 ant,maven

Moonant的专栏 1015

[转]linux: 学习linux/unix编程方法的建议

首先先学学编辑器,vim, emacs什么的都行。然后学make file文件,只要知道一点就行,这样就可以准备编程序了。然后看看《C程序设计语言》K&R,这样呢,基本上就可以进行一般的编程了,顺便找本数据结构的书来看。如果想学习UNIX/LINUX的编程,《APUE》绝对经典的教材,加深一下功底,学习《UNP》的第二卷。这样基本上系统方面的就可以掌握了。然后再看Douglus E

笑风生 632

如何学习linux编程

建议学习路径:  首先先学学编辑器,vim, emacs什么的都行。然后学make file文件,只要知道一点就行,这样就可以准备编程序了。   然后看看《C程序设计语言》K&R,这样呢,基本上就可以进行一般的编程了,顺便找本数据结构的书来看。   如果想学习UNIX/LINUX的编程,《APUE》绝对经典的教材,加深一下功底,学习《UNP》的第二卷。这样基本上   系统    方面的就可

tianxiaogang12的专栏 500

【UNIX 环境编程】GCC 编译器 | Makefile 基础入门 | GDB 调试教学

💭 写在前面:本文将介绍如何使用 GCC 编译器编译,并详细介绍了 Makefile 的基本构造、创建Makefile 文件以及 Makefile 变量,以提高编译效率。此外,本文还将探讨GDB调试器的使用,包括调试前的准备、readelf 读取 ELF 文件信息、显示代码、断点、调试、监视、跳转等内容。

有道无术, 术尚可求。有术无道, 止于术。 3022

Makefile学习连载---介绍1

MakeFile

Kellbook的博客 8942

Linux/Unix环境下的Make和Makefile详解

  Linux/Unix环境下的Make和Makefile详解   无论是在Linux还是在Unix环境中,make都是一个非常重要的编译命令。不管是自己进行项

Gene Wu的专栏 892

Linux/Unix环境下的make和makefile详解

Pathetique               无论是在Linux还是在Unix环境中,make都是一个非常重要的编译命令。不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或make   install。利用make工具,我们可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序,使用make和makefile工具就可以简洁明快地理顺各个源文件之间纷

acexuyy的专栏 314

makefile基础知识点学习

makefile基础知识点学习 在学习Makefile之前,首先介绍一下make命令,make命令是GNU的工程化编译工具,它用于编译大量互相关联的源代码,使用它可以实现项目的工程化管理,提高开发效率。那么对于一个项目,该如何让它按照我们预想的规则去编译链接执行呢?这就要用到我们要学习的Makefile了。Makefile的作用就是在执行make命令的时候指定编译和链接的规则,包括源代码文件之间的...

weixin_42134466的博客 263

【 Makefile 编程基础之一】详细介绍Makefile概念和其机制用途;

本站文章均为 李华明Himi 原创,转载务必在明显处注明:转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/gcc-makefile/766.html          ☞ 点击订阅 ☜ 本博客最新动态!及时将最新博文通知您! 概述:什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,

李华明Himi 4461
上一篇: Unix Shell 学习总结 -- Unix学习总结之一
下一篇: Linux网络编程基础之一--TCP --Unix学习总结之三
mayo
博客等级 码龄23年 5粉丝 7原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值