Makefile 入门与基本语法

在我看来,学会写简单的Makefile,阅读较复杂的makefile,是每一个Linux程序员都必须拥有的基本素质。Makefile可以自动识别哪些源文件被更改过,需要重新编译,那些不需要。从而节省大型工程重新编译的时间。规则如下:

  1. 如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。
  2. 如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程。
  3. 如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。

学会编写Makefile,不仅仅有益于你在Linux下编写大型工程。同时也能帮助你理解编译原理。远离IDE,了解编译过程。

废话少说,Makefile其实最主要的语法只有一句:

target ... : prerequisites ...
command......

target就是目标文件,prerequisites表示所有生成目标文件所需的拥有依赖关系的文件。command就是由依赖文件生成目标文件的编译命令。

所以,对于单个的.c文件,一个最最简单的Makefile如下:

object: main.c
    gcc -o object main.c

当然,对于单个C文件使用Makefile几乎没有意义。

下面来看一个稍复杂一点儿的Makefile文件:

DIR=./
object: main.o 1.o 2.o
    gcc -o object main.o 1.o 2.o
1.o: 1.c my.h
    gcc -c 1.c
2.o: 2.c my.h
    gcc -c 2.c
main.o: main.c my.h
    gcc -c main.c

.PHONY: clean

clean:
    rm $(DIR).o object

这是一个稍有实用价值的Makefile,工程由四个源文件构成:my.h 1.c 2.c main.c。

放在最前面的

DIR=./

是变量定义。Makefile中的的变量定义多为字符串,主要目的是为了避免重复长字符串输入。

1.o 2.o main.o 分别是三个源文件生成的链接文件。如果你不知道链接文件是什么。。。。找度娘吧。。

首先第一个target一般为最终目标文件,之后的target一般为过程文件。

.PHONY是用来定义伪目标用的。伪目标不是实际要生成的文件,一般为make命令带入的参数。例如上面文件中的clean,其对应的命令为清除所有中间文件以及最后的目标文件。

其实,一般不定义伪目标也是OK的,但是一旦目录下出现了和伪目标重名的文件。这时候Makefile执行伪目标命令就会出错。因为Makefile不知道这是伪目标,而伪目标又没有依赖文件,所以Makefile会跳过伪目标文件对应的命令。

以上,是对Makefile的一个简单入门介绍,一般,用以阅读大多数的Makefile都已经足够了。深究请百度或者Google。

时间: 2024-11-15 00:29:04

Makefile 入门与基本语法的相关文章

【IOS】IOS快速入门之OC语法

Objective-C 是 C 语言的超集 您还可以访问标准 C 库例程,例如在 stdlib.h 和 stdio.h 中声明的那些例程. Objective-C 还是一种非常动态的程序设计语言,而且这种动态是其最大优势.这种动态体现在它允许在运行应用程序时(即运行时)才去确定其行为,而不是在生成期间就已固定下来.因此,Objective-C 的动态机制让程序免受约束(编译和链接程序时施加的约束):进而在用户控制下,将大多数符号解析责任转移到运行时. 当您想要在源代码中包括头文件时,请在头文件或

Swift入门教程:基本语法大全

原文:Swift入门教程:基本语法大全       简介:                                                                                                                                                                                  什么是Swift                                  

vim+makefile入门编辑,编译,差错实例

vim+makefile入门编辑,编译,差错实例 vim makefile 编译 编写代码,一般在vim中编辑完后,输入:wq,在命令行下输入g++ hello.cc -o hello ,出现问题,打开vim,找到对应行修改,感觉是不是很烦很NC.其实vim自带的Quickfix列表就能帮助我们无需退出vim,即可进行编译代码,浏览错误信息. 简单单个文件的调试,只需增添环境变量makeprg即可. 编写一个简单的命名为hi.c的如下程序: #include<stdio.h> int main

老大写得一个很高大上的Makefile,包含很多语法:

一个很高大上的Makefile,包含很多语法: TARGET = api-login INSTALL_PATH = /huishoubao/cgi include ../../implements/log/Makefile.log include ../../implements/tools/Makefile.tools include ../../implements/db/Makefile.db include ../../implements/configure/Makefile.conf

Swift入门教程:基本语法(三)

打印输出 Swift提供了2个打印输出函数 println :输出内容后会自动换行 print :对比println,少了个自动换行的功能 示例 输出字符串 println("欢迎学习传智播客iOS学院Swift教程") var name = "传智播客iOS学院\n" print(name) 输出其他数据类型 var age = 7 println(age) println("我今年\(age)岁") 元组类型 什么元组类型 元组类型由 N个

Swift入门教程:基本语法(二)

数字格式 数字可以增加额外的格式,使它们更容易阅读 可以增加额外的零 0 let money = 001999           // 1999 let money2 = 001999.000   // 1999.0 可以增加额外的下划线 _ ,以增强可读性 let oneMillion1 = 1_000_000    // 1000000 let oneMillion2 = 100_0000      // 1000000 let overOneMillion = 1_000_000.000

Swift入门教程:基本语法(一)

      简介:                                                                                       什么是Swift Swift是苹果于2014年WWDC(苹果开发者大会)发布的全新编程语言 Swift在天朝译为"雨燕",右上角的图标就是它的LOGO 跟Objective-C一样,可以用于开发iOS.Mac应用程序 苹果从2010年7月开始设计Swift语言,耗时4年打造 Swift的语法特点

30天自制OS笔记:2 汇编语言学习与Makefile入门

进一步提高代码的高级程度,在之前的代码基础上修改,所以先拷贝再重命名为helloos.nas: 感觉还是添加个git比较方便,等helloos3完成后添加个git,这样可以保留历史,而不用每次都被覆盖了. --------------------------------- 先回顾下昨天的程序结构: 只有显示部分,昨天看懂了,继续2016年9月7日18:37:10,说实话那个 因为只能提醒很麻烦,所以取消notepad++自动补全: ? ? 下面把对代码的注释添加上: 寄存器: ? ? X表示扩展

makefile中的shell语法

在Makefile中写shell代码有点诡异,和不同的shell语法不太一样,如果不了解,看Makefile会莫名其妙.下面总结了一些. 1:尽在Makefile文件的目标项冒号后的另起一行的代码才是shell代码.eg:xx = xx1         // 这里时makefile代码yy:xx = xx2   // 这是是makefile代码,makefile允许变量赋值时,'='号两边留空格yy:    xx=xx3 // 只有这里是shell代码 ,shell不允许‘=’号两边有空格哦.