编译器-gcc/g++和自动化构建-make/Makefile
编译器gcc/g++
复习程序翻译
程序翻译需要经过4个过程:
预处理(进行宏替换/去注释/条件编译/头文件展开等)、
编译(生成汇编)、
汇编(生成机器可识别代码)、
链接(生成可执行文件或者库文件):把.o文件与库文件进行链接,生成可执行文件。
动态库和静态库
在Linux中命名特征,动态库(libxxxx.so)、静态库(libxxxx.a)。
windows中命名特征,动态库(xxxx.dll)、静态库(xxxxx.lib)。
现在有个.c文文件,编译的时候我们分别采用动态链接(默认)和静态链接(加上-static选项),会发现静态链接比动态链接的大小要大得多,但是liunx一般只会存在动态库没有静态库,要想使用静态库就要使用命令install glibc-static libstdc++-static -y。
因为静态链接方式是把我们要的库方法实现,直接拷贝到可执行程序中,而动态链接是在需要执行这个库函数的时候跳转到这个库里面去执行,所以文件大小上面会有差异。
自动化构建-make/Makefile
make是一个命令,makefile是一个文件
核心思想
在这个makefile文件中第一行就是依赖关系,第二行就是依赖方法,makefile的核心思想就是根据依赖关系和依赖方法形成可执行文件。
具体语法
1、makefile生成可执行文件之后还要把它清理掉,在依赖关系和依赖方法的后面加上:
2、make会定顶向下扫面makefile文件,默认形成第一个目标文件,如果想指定形成,在使用make命令时,后面就要加上目标文件。
3、.PHONY修饰clean叫做伪目标,伪目标所依赖的方法总是会被执行。
4、而为了提高编译效率,非伪目标被执行一次后如果依赖文件没有变化是不会执行第二次的,那么他是如何做到的呢?
5、makefile会进行依赖关系的推导,直到依赖文件是存在的,推导原则如下。
6、更加具有通用型的makefile。
7、以上是当前目录下只有一个 源文件,那要是当前目录有成百上千个源文件发呢?
于是makefile就变成这样了:
解释:
1、SRC=$(wildcard *.c)的意思就是,把所有的.c文件放在SRC里面,SRC里面的内容也可以写成$(shell ls *.c)。
2、OBJ=$(SRC:.c=.o)的意思就是,把SRC里面的文件的.c后缀变成.o后缀,然后放入到OBJ里面。
3、$^代表依赖文件列表,$@代表目标文件名。
4、%.o:%.c,其实%在makefile里面就是一个通配符。%.c会展开成多个文件,$<就会把展开的多个.c一个一个的交给这个命令,然后一个一个形成.o,其实$<就是把一批文件,一个一个的拿出来,经过该方法加工成同名.o文件。
5、如果不想再屏幕上回显,那就要再依赖方法前面加上@。