Makefile 总结

来源:互联网 发布:苏芬战争 知乎 编辑:程序博客网 时间:2024/05/18 01:35

最近在编写makefile文件时遇到了不少问题,又重新学习了了以下,做以下总结:

1   makefile的输出:

@echo 不是随便什么地方都可以输出的,必须是在target体里,而且跟顺序有关,看个例子吧:

CC = g++

THREAD = ../thread/

EXCEP = ../exception/

SYNC = ../sync/

ALLSOURCE= $(THREAD)*.cpp $(EXCEP)*.cpp $(SYNC)*.cpp

TALLSOURCE= $(wildcard $(ALLSOURCE))

CALLSOURCE = $(notdir $(TALLSOURCE))

OALLSOURCE = $(patsubst %.cpp,%.o,$(CALLSOURCE))

ALLSOURCE+= ServerSide.cpp Socket.cpp

all:server

@echo 11111

@echo $(ALLSOURCE)

@echo $(TALLSOURCE)

@echo $(CALLSOURCE)

@echo $(OALLSOURCE)

@echo 22222

.PHONY:server

server:$(OALLSOURCE)

$(CC) -o $@ $^ -lpthread

$(OALLSOURCE):$(ALLSOURCE)

$(CC) -c $^

.PHONY:clean

clean :

@rm -f *.o server

在这段代码中,可以打印出来ALLSOURCE 以及其他几个的结果,但是呢会出现什么问题,就是输出顺序会和我们想象有些差别,输出如下:

g++ -o server Job.o Thread.o ThreadPool.o ThreadManage.o WorkerThread.o Exception.o sync.o ServerSide.o Socket.o -lpthread

11111

../thread/Job.cpp ../thread/Thread.cpp ../thread/ThreadManage.cpp ../thread/ThreadPool.cpp ../thread/WorkerThread.cpp ../exception/Exception.cpp ../sync/sync.cpp ServerSide.cpp Socket.cpp

../thread/Job.cpp ../thread/Thread.cpp ../thread/ThreadPool.cpp ../thread/ThreadManage.cpp ../thread/WorkerThread.cpp ../exception/Exception.cpp ../sync/sync.cpp ServerSide.cpp Socket.cpp

Job.cpp Thread.cpp ThreadPool.cpp ThreadManage.cpp WorkerThread.cpp Exception.cpp sync.cpp ServerSide.cpp Socket.cpp

Job.o Thread.o ThreadPool.o ThreadManage.o WorkerThread.o Exception.o sync.o ServerSide.o Socket.o

22222

说明,先执行的是server的生成,然后再进行输出的,这个顺序要注意哦,要不然是打印不你想要的结果。。。
2。变量的复制与改变

还是以上面的代码为例吧,在我们申明变量后,再对变量进行修改时,这个变量会及时改变,这个很难理解,还是以上面代码为例吧:

在ALLSOURCE申明后,操作最后一次是在第二个红色ALLSOURCE的,但是你发现当我输出TALLSOURCE时,它已经改变了。。。我试着去解释,但。。。木有找到准确的原因。。。也许这就是makefile的神秘面纱吧。。。通过最近的makefile重新学习,还是收益颇多滴。。。如果还有疑惑可以看看前几篇blog。。。。

 3. 调用子文件夹Makefile

CC = g++

CFLAG = 

MAKE = make

SUBDIRS=socket

RECURSIVE_MAKE= @for subdir in $(SUBDIRS); \

        do \

        echo "making $@ in $$subdir"; \

( cd $$subdir && $(MAKE) all -f Makefile -e CC='${CC}' CFLAG='${CFLAG}') || exit 1;\

        done

 

RECURSIVE_CLEAN= @for subdir in $(SUBDIRS); \

        do \

        echo "cleaning $@ in $$subdir"; \

        ( cd $$subdir && $(MAKE) clean -f Makefile) || exit 1; \

        done

 

all: subdirs

 

.PHONY:subdirs

subdirs:

$(RECURSIVE_MAKE) #调用的是shell,所以应该以table开头

 

.PHONY:clean

clean:

$(RECURSIVE_CLEAN)