Linux编译器-gcc/g++使用
1.预处理(进行宏替换)
-E开始进行程序编译,在预处理做完的时候,停下来
2.编译(生成汇编)
-S 开始编译,编译做完了就停下来
3.汇编(生成机器可识别代码)
-c 开始翻译汇编完成,就停下来
hello.o可重定位目标文件(已经是二进制的了),并不能执行
4.连接(生成可执行文件或库文件)
函数库一般分为静态库与动态库
静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a”
动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”,如前面所述的 libc.so.6 就是动态库。gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件,如下所示。 gcc hello.o –o hello
gcc默认生成的二进制程序,是动态链接的,这点可以通过 file 命令验证。
make/makefile
make是一个命令,makefile是一个文件
第一行:依赖关系
第二行:tab键开头,依赖方法
完善makefile
make命令扫描makefile文件的时候,从上往下扫描,默认形成第一个目标文件
伪目标:总是被执行,对应的依赖方法和依赖关系
什么叫做不执行?默认老代码不做重新编译
make怎么知道bin和.c的新旧问题
维护类似于栈,从上向下读取
$@:代表目标文件
$^:依赖的众多文件列表
显示过程:
如果有多个文件
version1:
%:把当前路径下所有的.o/.c依次展开
进度条--命令行版本
一个进度条应该结合场景
process.c
main.c