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 生成的

 

 
posted @ 2017-05-11 15:50  ren_zhg1992  阅读(147)  评论(0)    收藏  举报