作为今天的学习记录:
- makefile是具备自己的环境变量,当然还有很多类型的变量,比方说,自定义和预定义变量。这里不得不说的是环境变量,在编写makefile的时候,我们总是想着:就一个makefile,然后可以用尽所有工程(这跟我们写移植性代码非常强的问题一样)。那么就需要清晰地考虑makefile的环境变量了。
- make进行递归调用(此时,有各种的subdir子目录),为了让subdir可以正确且按照我们的意愿去make(这里特指编译)。我们需要将maindir顶层目录的环境变量,通过各种方式(目前知道:makefile自带的具备环境变量属性的变量;或者通过export来传递变量属性,使得subdir获得maindir已经成功设置的环境变量)
- 多个目标(特指“终极目标”),像一个开源软件,总是会有各种test文档,这样附带了test_program,我们需要同时生成多个执行文件,这样求我们编写具备生成多个目标的makefile文件。
- 首先,可以直接使用makefile的伪目标,这样最简单。通过,make XX来决定
解决疑问:
- Makefile 中:= ?= += =的区别?解答链接
- makefile中,在规则的命令中使用-号,为了忽略错误继续执行,那么如果+号呢?点击链接
- 在通用makefile文章里面,使用makefile.build时候,出现了.d格式文件,点击链接解析.d文件(依赖文件,给makefile使用),论坛解析链接
.d dependencies
依赖文件。
是给Makefile用的。内容和Makefile的target相似:
假设hello.c里有
#include "hello.h"
hello.h里有
#include "foo.h"
#include "bar.h"
gcc -c -MMD hello.c就会产生hello.d
hello.o: hello.c hello.h foo.h bar.h
在Makefile里用-include 进来后
即使hello.c没有修改,即使hello.c没有直接include foo.h bar.h 只要hello.h foo.h bar.h中的任意一个修改都会重新编译hello.c
- 所谓的归档(使用gcc ar的时候),这意味着创建静态库,为了使多个.o合并在一起
- 在makefile中使用make递归调用,实现多级目录编译连接,这里应用到了伪目标的功能
makefile指定头文件位置:
//以下注意了,不能使用CFLAGS来包含头文件,这仅仅是编译选项
#CFLAGS += -I /home/hhc/sharefile/transport_sys/1sprint/2-safety_sys/my_openssl/include/
#CFLAGS += -L /home/hhc/sharefile/transport_sys/1sprint/2-safety_sys/my_openssl/lib/
INC = -I /home/hhc/sharefile/transport_sys/1sprint/2-safety_sys/my_openssl/include/
INC += -L /home/hhc/sharefile/transport_sys/1sprint/2-safety_sys/my_openssl/lib/
这是一个严重的基础知识错误,CFLAGS仅仅能够装载编译选项,不是能够识别头文件包含关系
其次,今天对make的选项问题有了新的理解,在以及写好makefile时候,也是可以在执行make命令时,添加适当的编译选项(make选项),来动态改变(这种改动比较小,如果是大改动就需要进一步修改makefile)make的执行