Makefile - 从无到有

2024-04-24 20:18
文章标签 makefile 从无到有

本文主要是介绍Makefile - 从无到有,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Makefile这玩意在上学时就应该学,可是一直沉浸于IDE的诱惑,所谓“死于安乐”,直到现在一把年纪才开始接触这种基础东西。




创建C程序

先写个c程序,保存在main.c里:
view plain
//
// file: main.c
//

#include <stdio.h>

int main()
{
int c = 0;
printf("Tommy: %d\n", c+5);
return 0;
}



看看我这时的目录结构
view plain
~/code/makefile$ ls
main.c

这时敲个“make”命令试试?
view plain
~/code/makefile$ make
make: *** 没有指明目标并且找不到 makefile。 停止。



创建makefile文件
显然,我们要建个名为“makefile”的文件。先建一个空的名为makefile的文件:
view plain
~/code/makefile$ touch makefile
tommy@tommy-zheng-ThinkPad-T61:~/code/makefile$ ls
main.c makefile
这时再试试“make”命令:
view plain
~/code/makefile$ make
make: *** 无目标。 停止。

加入target
错误“无目标”告诉我们需要在makefile里添加一些东西:
view plain
# 注释 file: makefile
target:
再执行“make”命令:
view plain
~/code/makefile$ make
make: 没有什么可以做的为 `target'。

可以看到前面“无目标”的错误已经解决了。



加入命令
继续往makefile里添加东西:
view plain
# 注释 file: makefile
target:
gcc -o tommy main.c # 注意,最前面是tab,不是空格!
好了,执行make命令:
view plain
~/code/makefile$ make
gcc -o tommy main.c
~/code/makefile$ ls
main.c makefile tommy
main.c被编译了,一个可执行文件“tommy”产生了。我们执行一下试试:
view plain
~/code/makefile$ ./tommy
Tommy: 5

我们的makefile写完了!!!



好吧,之前的makefile实在是太简单,以至于没什么实际的用途。现在再深入研究下。


Target
在前面的makefile里,有一个叫"target"的东西。其实它可以是任何名字,而且一个makefile里可以有多个target。比如下面的makefile:
view plain
# 注释 file: makefile
tommy:
gcc -o tommy main.c # 注意,最前面是tab,不是空格!
dosomething:
echo just for fun.
给make命令一个参数:
view plain
~/code/makefile$ make dosomething
echo just for fun.
just for fun.

可以看到,make可以用来执行任何一个target底下的命令,而这种命令并不局限于gcc这种编译的命令。每个target用冒号隔开。如果make命令没有指定哪个target,那第一个target下的命令会被执行。



Dependencies

make命令一次只能处理一个target,但如果我想一次处理多个target怎么办?这时可以为一个target在冒号后面指定它所依赖的target。修改下makefile:
view plain
# 注释 file: makefile
tommy:
gcc -o tommy main.c # 注意,最前面是tab,不是空格!
dosomething: dofirst dosecond # 先执行另两个target的命令
echo just for fun.
dofirst:
echo first.
dosecond:
echo second.
donothing:
echo nothing.
make一下看看:
view plain
~/code/makefile$ make dosomething
echo first.
first.
echo second.
second.
echo just for fun.
just for fun.
可以看到,dofirst和dosecond在dosomething之前都被make了,但tommy和donothing都没有执行。

编译多个C文件

现在增加两个文件f.h和f.c,同时改一下main.c:
view plain

// file: f.h


int add(int, int);


// file: f.c


int add(int a, int b)
{
return a + b;
}

//
// file: main.c
//

#include <stdio.h>
#include "f.h"

int main()
{
printf("Tommy-add: %d\n", add(2, 4));
return 0;
}
看看我的目录结构:
view plain
~/code/makefile$ ls
f.c f.h main.c makefile
基于前面的“Dependencies”得到的结论,我们可以改写makefile,来让main函数调用f函数:
view plain
# file: makefile
tommy: main.o f.o
gcc -o tommy main.o f.o
main.o:
gcc -c main.c -o main.o
f.o:
gcc -c f.c -o f.o
看下生成的结果:
view plain
~/code/makefile$ make
gcc -c main.c -o main.o
gcc -c f.c -o f.o
gcc -o tommy main.o f.o

~/code/makefile$ ls
f.c f.h f.o main.c main.o makefile tommy

~/code/makefile$ ./tommy
Tommy-add: 6
可以看到我们的生成了我们想要的东西。

clean与install
经常可以看到“make clean”和“make install”的命令。我们也可以提供它们:
view plain
# file: makefile
tommy: main.o f.o
gcc -o tommy main.o f.o
main.o:
gcc -c main.c -o main.o
f.o:
gcc -c f.c -o f.o
clean:
rm *.o
install:
mv tommy /usr/local



最后再研究下makefile里的宏。其实就是定义一个变量,之后再使用它:
view plain
# file: makefile
INSTALL_PATH = /usr/local
TEMP_FILES = *.o
tommy: main.o f.o
gcc -o tommy \
main.o f.o # 这里演示反斜杠用于换行,注意反斜杠后没有空格,行首是tab而非空格
main.o:
gcc -c main.c -o main.o
f.o:
gcc -c f.c -o f.o
clean:
rm $(TEMP_FILES)
install:
mv tommy $(INSTALL_PATH)

(完)


原文:http://blog.csdn.net/yourtommy/article/details/6887686

这篇关于Makefile - 从无到有的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/932736

相关文章

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

Kernel 中MakeFile 使用if条件编译

有时需要通过if  else来选择编译哪个驱动,单纯的obj-$(CONFIG_)就不是很方便,下面提供两种参考案例: 案例一: 来源:drivers/char/tpm/Makefileifdef CONFIG_ACPItpm-y += tpm_eventlog.o tpm_acpi.oelseifdef CONFIG_TCG_IBMVTPMtpm-y += tpm_eventlog.o

Makefile问答之02 预处理器与宏

GCC Makefile中,怎样设定预处理器名称 在 GCC 的 Makefile 中,预处理器(preprocessor)的名称通常是 cpp(C PreProcessor),但在实际的 Makefile 中,我们一般是通过 gcc 命令来调用预处理器,而不是直接调用 cpp。不过,你可以通过设置 CPP 变量来显式指定预处理器名称和选项。以下是如何在 Makefile 中进行设置和使用的

如何在linux下写makefile

Windows下用集成开发环境(IDE)开发程序时不会涉及到编译、链接的步骤,集成开发环境已经把这些工作给你集成好了,你要做的就是根据语言的语法来编写代码。所以Windows下开发程序对makefile会有点生疏。         makefile的作用也是把你编写好之后的源文件进行编译与链接,只是它这个过程需要你自己去指定编译与链接的文件。 makefile的基本格式如下: tar

Makefile函数

定义$(函数名 参数)  或  ${函数名 参数} 例如: $(wildcard PATTERN) wildcard函数作用是列出所有PATTERN的文件 ,这里该参数可以是用通配符 例如*.c,就代表列出所有以.c结尾的文件。 $(patsubst <pattern>,<replacement>,<next>) patsubst函数作用是查找next中的单词,是否满足pattern的模式

记录下Makefile

把Makefile记录下,以后别忘了。 #CC = aarch64-linux-gnu-gcc#AS = aarch64-linux-gnu-as#AR = aarch64-linux-gnu-arCC = gccAS = asAR = arPROGRAMS =mainCUR_DIR = $(shell pwd)SRCS = $(CUR_DIR)/srcINCS = $(CUR_D

Linux工程管理文件Makefile命令与变量-基础篇

1.Makefile命令 在一个规则中,除了目标和目标依赖外,还有一个重要的部分:命令。 命令一般由shell命令(echo、ls)和编译器的一些工具(gcc、ld、ar、objcopy等)组成,使用tab键缩进。 .PHONY: cleana.out: hello.c echo "start compiling..." gcc -o a.out hello.c echo

【C++】日期类函数(时间计数器)从无到有实现

欢迎来到Harper·Lee的学习笔记! 博主主页传送门:Harper·Lee的博客主页 个人语录:他强任他强,清风拂山岗! 一、前期准备 1.1 检查构造的日期是否合法 bool Date::CheckDate(){if (_month < 1 || _month > 12|| _day < 1 || _day > GetMonthDay(_year, _mont

Linux Makefile.txt 分析

linux 2.6.x Makefile  linux-2.6.x makefile   linux-2.6.20.6/Documentation/kbuild/makefiles.txt   一、             概述   linux的makefile有五个部分:   Makefile:顶层Makefile .config:内核配置文件 a