1、只更新.h头文件,make不能重新编译。
需要在依赖文件列表中,把目标文件所依赖的.h文件添加上即可。
main:main.o obj.o
g++ -o $@ $^
main.o:
g++ -c main.cpp
obj.o:obj.cpp
g++ -c obj.cpp -o $@
例如,目标文件obj.o需要依赖obj.h和obj.cpp,如果obj.h发生改变,但是其他文件都没变,目标文件也没有被删除,此时重新执行make,不会重新编译。
要达到.h文件改变,直接make就可以重新编译,即:自动增量编译,需要添加到依赖文件列表。
改动如下:
main:main.o obj.o
g++ -o $@ $^
main.o:
g++ -c main.cpp
obj.o:obj.cpp obj.h
g++ -c obj.cpp -o $@
2、一些特殊符号
(1)Makefile中的 符号 $@, $^, $< 的意思:
$@ 表示目标文件
$^ 表示所有的依赖文件
$< 表示第一个依赖文件
$? 表示比目标还要新的依赖文件列表
(2)wildcard、notdir、patsubst的意思:
wildcard : 扩展通配符
notdir : 去除路径
patsubst : 替换通配符
(3)gcc -I -L -l的区别:
gcc -o hello hello.c -I /home/hello/include -L /home/hello/lib -lworld
上面这句表示在编译hello.c时
-I /home/hello/include表示将/home/hello/include目录作为第一个寻找头文件的目录,
寻找的顺序是:/home/hello/include-->/usr/include-->/usr/local/include
-L /home/hello/lib表示将/home/hello/lib目录作为第一个寻找库文件的目录,
寻找的顺序是:/home/hello/lib-->/lib-->/usr/lib-->/usr/local/lib
-lworld表示在上面的lib的路径中寻找libworld.so动态库文件(如果gcc编译选项中加入了“-static”表示寻找libworld.a静态库文件)
3、编译命令中,目标文件顺序和链接库问题
g++编译命令,链接库在目标文件之后,否则导致链接库无效,编译报链接库中函数未定义的错误。(gcc暂未测试)
INCLUDE = -I.
INCLUDE += -I/usr/local/include/
FDFLAGS = -Wl,-Bstatic
FDFLAGS += /usr/local/lib/liblog4cpp.a
FDFLAGS += -Wl,-Bdynamic
FDFLAGS += -L/usr/local/lib
FDFLAGS += -L/usr/lib64 -lpthread
g++ $(INCLUDE) -o test $(objs) $(FDFLAGS)
即:-o test 需要在 $(FDFLAGS) 之前.
放在之前则会报错,如下:
参考文章: