makefile
今天写一个makefile画了一上午功夫,归根结底是之前写的太少了,只是知道一些皮毛,现在来巩固一下基本的使用。
关于程序的编译和链接:
一般来说,c或者是c++,首先把源文件 (*.c 或*.cpp)编译成为中间代码文件,这个中间代码文件在windows下是*.obj文件在linux 或unix 是*.o文件即object file 目标文件这个动作就叫做编译,即把源文件编译成目标文件的过程就叫做编译(compile)。这以后,再把大量的*.obj 或 *.o 目标文件合成一个可以执行的文件,这个工程就叫做链接link。编译时,主要是检查程序的语法是否正确,函数,变量是否都有声明。至于链接呢,主要是链接函数,和全局变量。
makefile的隐式规则会自动找这些在文件里包含的头文件的。
1.生成一个可执行文件
先来一个makefile
CC=gcc CFLAGS=-Wall -g BIN=iceftpd OBJS=main.o sysutil.o session.o ftpproto.o privparent.o str.o \ tunable.o parseconf.o privsock.o hash.o LIBS=-lcrypt $(BIN):$(OBJS) $(CC) $(CFLAGS) $^ -o $@ $(LIBS) %.o:%.c $(CC) $(CFLAGS) -c $< -o $@ .PHONY:clean clean: rm -f *.o $(BIN)
最终生成的是可执行文件iceftpd
2.生成多个可执行文件
我们的makefile先这样写:
main1:main1.o a.o b.o c.o gcc -o main1 main1.o a.o b.o c.o main2:main2.o a.o b.o c.o gcc -o main2 main2.o a.o b.o c.o main3:main3.o a.o b.o c.o gcc -o main3 main3.o a.o b.o c.o
看看执行结果是什么 why?
执行结果 只执行了第一个 生成了main1 why??
正确的写法:
.PHONY:all clean正确的写法: all:main1 main2 main3 main1:main1.o gcc -o main1 main1.o main2:main2.o gcc -o main2 main2.o
main3:main3.o gcc -o main3 main3.o clean: rm -f *.o main1 main2 main3
这里会自动由.c生成.o
这样就生成了 三个 可执行文件main1 main2 main3
我们再可以运用变量把makefile写简单一些:
.PHONY:clean all CC=gcc CFLAGS=-Wall -g BIN=main1 main2 main3 all:$(BIN) %.o:%.c $(CC) -c $(CFLAGS) $< -o $@ clean: rm -f *.o $(BIN)
会自动根据.o生成可执行文件,但是要求名称一致。比如:这里main1.c 生成的

浙公网安备 33010602011771号