前言
liunx 中没有像windows下的visual stdio ide 之类的集成管理工具,所有我们需要自己使用脚本的方式来对项目进行管理,如当前你需要一个
debug版本的项目可执行环境,那么你需要一个项目构建debug可执行文件的脚本来生成它。发布relese可执行文件或环境时也是同理。
声明
该文章由笔名为钱德勒老师指导,且由我整理输出的,如果对文章中的内容敏感,请联系删除。
/*
测试代码目录 >>
testting----
|---- global.h
|---- global.c
|---- main.c
*/
目录
Liunx 的程序编译流程之 .i
/*
作用: 将 .h 文件中的引用内容展开,并输出为 .i 文件
格式: sudo gcc -E -o [target.i] [source.c]
例子: sudo gcc -E -o main.i main.c 和 sudo gcc -E -o global.i global.c
解析:
我们由图 compile_main_file_i.png 和 compile_global_file_i.png 得知编译器在预处理步骤做了以下内容 >>
1. 预处理器在.cpp中遇到#include<> 或者 #include "", 都会将#include<> 或者 #include "" 指令替换为他们包含的头文件中的内容,形成 .i文件
2. 头文件只在预处理期起作用,预处理过后生成 .i 文件,此后头文件就没有作用了
*/
compile_global_file_i.png
compile_main_file_i.png
Liunx 的程序编译流程之 .s
/*
作用: 将 .i 文件中的代码进行编译,并输出为 .s 的汇编文件
格式: sudo gcc -S [source.c]
例子: sudo gcc -S main.c 和 sudo gcc -S main.c
解析:
我们由图 compile_global_file_s.png 和 compile_main_file_s.png 得知以下内容 >>
1. 编译器将 .i 文件中的代码编译成了 .s 汇编代码,但是这个代码对于人类而言,还是勉强能够看得懂的
2. 编译器将预编译文件转换为汇编文件,在这个步骤将优化掉预编译步骤中的所有的预处理西信息
*/
compile_global_file_s.png
compile_main_file_s.png
Liunx 的程序编译流程之 .o
/*
作用: 将 .s 文件中的代码进行编译,并输出为 .o 的二进制文件
格式: sudo gcc -c -o [target.o] [file.s]
例子: sudo gcc -c -o global.o global.s 和 sudo gcc -c -o main.o main.s
解析:
我们由图 compile_file_o.png 得知以下内容 >>
1. 编译器将 .s 文件编译成了二进制代码文件了
2. 这种文件对于正常的人类来说,是看不懂的,编译器对于程序来说,在这个步骤就完成了
3. 这个文件会以导入点、导出点、数据段、代码段等信息组成
4. 如果你有兴趣的话,可以用二进制的方式打开这个文本,然后去转换为汇编代码,当然我是不会那样去做的,原因很多
*/
compile_file_o.png
Liunx 的程序编译流程之 .elf
/*
作用: 将多个 .o 文件中的代码进行链接,并输出为 .elf 的可执行文件
格式: sudo gcc -o [target] [files.o]
例子: sudo gcc -o testting global.o main.o
解析:
1. 可运行就对了
2. 它会将每一个 .o 文件对应的导入点、导出点、数据段、代码段等信息按照一定的顺序合并到 .elf 文件中
*/
作者:
怪小子
Github:
https://github.com/MrSunHua
邮箱:sh4a01@163.com
本文版权归作者和博客园共有,欢迎转载,如文章有版权冲突或者有更好的见解及建议,还望联系博主讨论并修改。