gcc/g++同理
编译器运行过程
1. 预处理(进行宏替换)
gcc -E a.c -o a.i
预处理后还是c语言
-E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
告诉gcc,从现在开始进行程序的翻译,将预处理工作做完停下
2. 编译(生成汇编)
gcc -S a.o -o a.s
-S 编译到汇编语言不进行汇编和链接
从现在开始进行程序的翻译,将编译工作做完,就停下,可以从.i开始也可以从.c开始
3. 汇编(生成机器可识别代码)
将汇编语言翻译成二进制文件(目标文件)
gcc -c a.s -o a.o//.o文件不能执行
-c 编译到目标代码
从现在开始进行程序的翻译,将汇编工作做完就停止
4. 连接(生成可执行文件或库文件)
gcc a.o –o a
将可重定位目标二进制文件和库进行连接形成可执行程序
./[生成的目标文件]
./a
执行可执行文件
库的概念
动态库不能缺失,一旦对应动态库缺失,影响的不知一个程序,会导致很多程序都无法运行
在编译器使用静态库进行静态链接时,会将自己的方法拷贝到目标程序中,该程序以后不用再依赖静态图
linux中 .so动态库 .a 静态库
Windows中 .dll动态库 .lib静态库
在linux中编译形成可执行程序,默认采用的是动态链接
Linux中静态链接指令:gcc a.c -o a_static -static
安装静态库
C/C++静态库
yum install -y glibc-static//C静态库
yum install -y libstdc++-static//C++静态库
gcc格式
格式 gcc [选项] 要编译的文件 [选项] [生成的目标文件]
gcc选项
-E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
告诉gcc,从现在开始进行程序的翻译,将预处理工作做完停下
-S 编译到汇编语言不进行汇编和链接
从现在开始进行程序的翻译,将编译工作做完,就停下,可以从.i开始也可以从.c开始
-c 编译到目标代码
从现在开始进行程序的翻译,将汇编工作做完就停止
-o 文件输出到文件 -o后面永远跟着可执行程序文件
-static 此选项对生成的文件采用静态链接
-g 生成调试信息。GDB 调试器可利用该信息。(要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项,进入debug模式)
-shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.
-O0 -O1 -O2 -O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
-w 不生成任何警告信息。
-Wall 生成所有警告信息。