GCC
GCC
GNU C Compiler
GNU Compiler Collection
GNU Binutils,即GNU Binary Utilities
Windows |
源文件.c |
目标文件.obj |
可执行文件.exe 动态链接库.dll |
Linux |
源文件.c |
目标文件.o |
可执行文件.elf |
ld链接器:将多个目标文件链接成一个可执行文件或目标库文件
as汇编器:将汇编源代码编译为目标机器代码
预处理 |
→ |
编译 |
→ |
汇编 |
→ |
链接 |
gcc -E 源文件.c -o 预处理文件.i |
gcc -s 预处理文件.i -o 汇编文件.s |
gcc -c 汇编文件.s -o 目标文件.o |
gcc 目标文件.o -o 可执行文件 |
gcc -o 指定输出文件的文件名
-Wall 开启编译器常用警告
-g 在生成的目标文件中保留调试信息(可使用strip命令去掉可执行文件中的调试信息)
-w 关闭所有警告
-I dir 在头文件的搜索路径中添加dir目录
-v 显示详细的编译过程信息
-l 表示链接库标准表达式,如-lpthread表示链接libpthread.so;默认优先选用动态库,除非使用-static指定
-L dir 指明从dir目录加载库
-On 代码优化,优化级别n可为1、2、3
静态库(.lib):把库自身目标代码与可执行程序链接到一个文件中,适用范围广,但使得可执行程序较大;
动态库(.dll):库自身目标代码与可执行程序分离,运行时动态加载,多个应用程序可共享库文件,可执行程序较小,但运行前需安装好库文件(版本、安装位置等)。
静态链接库,就是把(lib)文件中用到的函数代码直接链接进目标程序,程序运行的时候不再需要其它的库文件。调用静态链接库,需要对应的头文件staticdll.h和对应的静态链接库文件staticdll.lib。
动态链接库,就是把调用的函数所在文件模块(DLL)和调用函数在文件中的位置等信息链接进目标程序,程序运行的时候再从DLL中寻找相应函数代码,因此需要相应DLL文件的支持。调用动态链接库,需要对应的头文件dynamic.h和对应的导入库文件dynamic.lib,同时还要将dynamic.dll文件与执行文件exe放在同一个目录下。
项目编译过程:
1、配置系统环境,确定编译参数,保存在configure脚本文件中;
2、确定标准库和头文件的位置;
3、确定依赖关系,保存在makefile文件中;
4、头文件的预编译;
5、预处理(编译器替换源码中的头文件和宏);
6、生成机器码,链接生成可执行程序;
7、安装(创建目录、保存文件、设置权限等);
8、操作系统连接;
9、生成安装包。