Makefile使用的一些心得

26 篇文章 1 订阅

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、一些特殊符号

1Makefile中的 符号 $@, $^, $< 的意思:
  $@  表示目标文件
  $^  表示所有的依赖文件
  $<  表示第一个依赖文件
  $?  表示比目标还要新的依赖文件列表

(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) 之前.
放在之前则会报错,如下:
链接库位置

参考文章:

  1. Makefile 连接静态库注意事项
  2. 多个文件目录下Makefile的写法
  3. linux下g++ 编译时动态库和静态库的链接和头文件问题
  4. g++ 链接静态库命令应该放在最后
  5. gcc/g++ 静态动态库 混链接.
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值