首页 > 学院 > 开发设计 > 正文

Makefile使用的一些心得

2019-11-06 08:11:55
字体:
来源:转载
供稿:网友

1、只更新.h头文件,make不能重新编译。

需要在依赖文件列表中,把目标文件所依赖的.h文件添加上即可。

main:main.o obj.o g++ -o $@ $^ main.o: g++ -c main.cppobj.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.cppobj.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,-BstaticFDFLAGS += /usr/local/lib/liblog4cpp.aFDFLAGS += -Wl,-BdynamicFDFLAGS += -L/usr/local/libFDFLAGS += -L/usr/lib64 -lpthreadg++ $(INCLUDE) -o test $(objs) $(FDFLAGS)

即:-o test 需要在 $(FDFLAGS) 之前. 放在之前则会报错,如下: 链接库位置

参考文章:

Makefile 连接静态库注意事项多个文件目录下Makefile的写法 linux下g++ 编译时动态库和静态库的链接和头文件问题 g++ 链接静态库命令应该放在最后gcc/g++ 静态动态库 混链接.
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表