c文件的执行
c源文件到可执行一共需要经历4个阶段。使用gcc编译程序要经过预处理、编译、汇编、链接。
预处理
编译器主要加载头文件、条件编译、宏替换,使用:
gcc -E main.c > main.i,
编译
编译过程中,编译器主要做语法检查和词法分析,没有问题之后将会翻译成汇编代码或者中间代码:
gcc -S main.i -o main.s
汇编
汇编阶段将main.s文件转化为二进制目标代码
gcc -c main.s -o main.o
链接
编译成功之后,进入链接,将目标文件、启动代码、库文件链接成可执行文件的过程
gcc main.o -o main.exe
gcc与g++
gcc与g++都是GUN的c&c++的编译器但是他们有以下区别:
- 后缀.c,gcc当作c程序,g++当作c++程序;后缀为cpp,gcc与g++都当作c++程序,虽然C++是c的超集,但是语法要求还是有区别的
- 编译阶段,对于c++程序,gcc与g++都可以,不过gcc不能自动完成C++程序与使用库联接,通常使用g++,通常使用g++编译,g++会调用c++,其实差不多
gcc 命令常用选项的功能:
- gcc main.c :执行预处理、汇编、编译、联接形成可执行文件,未指定输出文件名默认a.out
- -x language filename:可以指定语言`c', `objective-c', `c-header', `c++', `cpp-output', `assembler', and `assembler-with-cpp',比如 gcc -x c main.mm,后缀随便
- -x none filename:关掉上一个选项,让gcc根据文件后缀识别文件类型,比如:gcc -x c main.mm -x none main2.c
- -c : 激活预处理、编译、汇编生成obj文件
- -S :激活预处理和编译,生成汇编代码
- -E : 激活预处理,不生成文件,自己可以重定向到输出文件 gcc -E main.c > main.i
- -o :指定目标名称,链接
- -ldir :使用#include"file" 时,gcc/g++默认在当前目录查找后文件,可以使用ldir执行目录
- -l :取消前一个参数的功能,一般用在-ldir后
- -g :只是编译器,在编译的时候,产生调试信息,使用参数-g才能使用gdb调试程序
- -static 链接静态库,禁止使用动态库
- -shared 进行动态库链接
- lname 链接静态库(libname.a)或动态库(libname.so)的库文件
- -fPIC(或fpic) 生成使用相对地址无关的目标代码
- -ltest 引用动态库
C/C++各种后缀
源文件后缀
.c C源程序;预处理,编译,汇编
.C C++源程序;预处理,编译,汇编
.cc C++ 源程序;预处理,编译,汇编
.cxx C++源程序;预处理,编译,汇编
.m Objective-C源程序;预处理,编译,汇编
.i 预处理后的C文件;编译,汇编
.ii 预处理后的C++ 文件;编译,汇编
.s 汇编语言源程序;汇编
.S 汇编语言源程序;预处理,汇编
.h 预处理器文件;通常不出现在命令行上
其他后缀名的文件被传递给连接器(linker).通常包括:
.o 目标文件(Object file)
.a 静态链接库
.so 动态链接库