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
还是以上面的代码为例吧,在我们申明变量后,再对变量进行修改时,这个变量会及时改变,这个很难理解,还是以上面代码为例吧:
在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)
- makefile总结
- Makefile总结
- Makefile 总结
- makefile总结
- makefile 总结
- Makefile总结
- Makefile总结
- Makefile总结
- makefile 总结
- Makefile总结
- Makefile总结
- Makefile总结
- Makefile 总结
- Makefile总结
- Makefile 总结
- makefile总结
- makefile总结
- makefile 总结
- 电影《 昂山素季 》有感
- xcode 中异步调用 WebService 获得大数据量的处理方式
- 2. HTML之标签
- 鸟哥的私房菜学习笔记
- mysql外键记忆
- Makefile 总结
- QT程序字体小
- for /f 用法详解
- 自动删除过期归档日志
- c# winform 将png图片自制为鼠标
- 得到自己的公网IP C代码
- Top 150 1.1 unique character
- HTML和 XHTML的最大不同
- Android关于view按键音的修改