图片 2

Makefile简单入门教程

Posted by

出现变量重定义的情况?

6、Makefile升级5
有时使用的编译器可能是g++、gcc甚至是arm-linux-gcc。为了方便统一管理,最好开头定义一个变量来代表编辑器,然后在gcc命令上变成$(CC):
Makefile升级如下:
CC:=gcc    #注释:定义一个变量,表示当前编辑器为gcc
exe:=main
obj:=main.o a.o b.o c.o
all:$(obj)
 $(CC) -o $(exe) $(obj) 
%.o:%.c
 $(CC) -c $^ -o $@
.PHONY:clean
clean:
 rm -rf $(obj) $(exe)

链接的两个文件都定义了同一个变量

main.c

1 #include <stdio.h>
2 
3 int a = 100;
4 
5 int main() {
6 
7     return 0;
8 }

a.c

int a = 200;

编译命令:

gcc -c main.c -o main.o

gcc -c a.c -o a.o

gcc main.o a.o -o main

最后一步链接会报错:

 图片 1

三、Makefile演进
1、一个项目有main.c/a.c/a.h/b.c/b.h五个文件;main.c包含a.h和b.h并使用相关函数;然后建立一个新的Makefile文件,内容如下:
main:a.o b.o
 gcc -o main a.o b.o 
a.o:a.c
 gcc -c a.c -o a.o 
b.o:b.c
 gcc -c b.c -o b.o

源文件与include的文件定义了同一个变量

main.c

1 #include <stdio.h>
2 #include "a.c"
3 
4 int a = 100;
5 
6 int main() {
7 
8     return 0;
9 }

a.c

 1 int a = 200; 

编译命令:

gcc main.c -o main

编译报错:

 图片 2

注意:命令必须是tab键开头的。

目标n:目标依赖  然后回车+tab键
 命令;

2、Makefile升级1
采用makefile变量:想用就用,没有类型,不需要定义(引用变量使用$(obj)来包含更多.o文件)
方法:obj:=a.o b.o
那么上面的Makefile程序升级如下:
obj:=a.o b.o
main:$(obj)
 gcc -o main a.o b.o 
a.o:a.c
 gcc -c a.c -o a.o 
b.o:b.c
 gcc -c b.c -o b.o

目标1:目标依赖  然后回车+tab键
 命令;

图片 3

以上Makefile升级如下:
obj:=a.o b.o
main:$(obj)
 gcc -o main $(obj) 
%.o:%c      #注释:模式通配,自动将.c文件编译成.o文件
 gcc -o $@ -c $^    #注释:通配符
clean:
 rm -rf *.o main

make命令执行时,需要一个 Makefile
文件,以告诉make命令需要怎么样的去编译和链接程序(简单将:管理工程的文件,决定先编译哪些文件,编译顺序)。

推荐一本书:GNU make中文手册(翻译整理:徐海兵)

相关文章

Leave a Reply

电子邮件地址不会被公开。 必填项已用*标注