程序翻译的过程
程序翻译的过程就是将C语言转换成二进制指令的过程。
- 预编译(完成 去注释、宏替换、头文件展开、条件编译等工作):
gcc -E test.c -o test.i
- 编译(将C文本替换成汇编语言):
gcc -S test.i -o test.s
- 汇编(形成可重定向二进制目标文件):
gcc -c test.s -o test.o
以文本的形式查看。
od
以二进制的形式查看。
- 链接(多个.o目标文件合并形成一个可执行文件):
gcc test.o -o Test
动静态库的链接
程序翻译的过程中,可执行文件的形成需要链接。
-
动态链接
ldd
命令可以查看文件所需要链接的库文件。(gcc默认形成的可执行程序是动态链接的)
例如程序中使用printf
函数需要包含stdio.h
头文件,但头文件只是声明,最终程序运行还需要去库中找实现的方法体。
通过动态的链接,将库中方法的地址,填入可执行程序中,建立关联,进行使用。 -
静态链接
静态链接相比动态链接会更占用资源。
因为静态链接是将库中实现的方法真的拷贝到可执行程序中进行使用。
-static
的作用是使用静态链接的方式形成可执行程序。
如果静态链接报错可以使用sudo yum install -y glibc-static
命令进行C语言静态库的安装,使用sudo yum install -y libstdc++-static
命令进行C++静态库的安装。
Linux环境下,动态库文件的后缀一般为.so
,静态库文件的后缀一般为.a
。
make & Makefile 的使用
make
是一个命令,Makefile
是一个文件。make
和Makefile
的使用可以帮助自动化地构建项目。
Makefile
的编写需要有依赖关系和依赖方法。
执行make
指令,会执行Makefile
文件中第一个依赖关系所对应的依赖方法。
因为clean
的依赖关系不是第一个,所以执行clean
需要make clean
。
对于伪目标的作用,就是它的方法总是被执行的。Test
因为不是伪目标,不能总是被执行,而clean
可以。
这里信息提示说,Test
已经是最新的了,那是通过什么来确定它是最新的呢?
这里就介绍一下stat
指令。
stat
主要可以查看文件的三种时间。
Access
是访问文件的最近时间。Modify
是文件内容被修改的最近时间。Change
是文件属性被修改的最近时间。
而Makefile
就是通过Modify
时间和形成的可执行文件的时间的比较,来确定文件是不是最新的。