gcc/g++参数以及使用

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   动态链接库

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章