g++编译命令使⽤以及参数详解
gcc & g++现在是gnu中最主要和最流⾏的c & c++编译器。
g++是c++的命令,以.cpp为主,对于c语⾔后缀名⼀般为.c。这时候命令换做gcc即可。其实是⽆关紧要的。
其实编译器是根据gcc还是g++来确定是按照C标准还是C++标准编译链接。
下⾯以Test.cpp为例:
命令: g++ Test.cpp
功能:⽣成默认为a.exe的⽂件,这个过程包含了编译和链接。
再说下-o命令,-o命令表⽰输出的意思,gcc/g++命令是⾮常灵活的,你不指定输出的⽂件名的时候默认⽣成的是.exe⽂件。你要输出的话可以⽤:g++ - Test.cpp。-o命令是输出的意思,这样就输出了。
gcc/g++在执⾏编译⼯作的时候,总共需要以下⼏步:
[cpp]
1. /*************************
2.        Test.cpp
3.    *************************/
4.    #include <IOSTREAM>
5.
6.    static int t = 1;
7.    #define T 9
8.
9.    using namespace std;
10.
11.    typedef int Status;
12.
13.    int main()
14.    {
15.        Status i = 1;
16.        cout << T * i << endl; //Test Cout
17.        return 0;
18.    }
1.预处理,⽣成.i的⽂件[预处理器cpp]
命令:g++ -E Test.cpp > Test.i
功能:输出预处理后的⽂件,linux下以.i为后缀名。只激活预处理,这个不⽣成⽂件,你需要把它重定
向到⼀个输出⽂件⾥。这⼀步主要做了这些事情:宏的替换,还有注释的消除,还有到相关的库⽂件。⽤编辑器打开Test.i会发现有很多很多代码,你只需要看最后部分就会发现,预处理做了宏的替换,还有注释的消除,可以理解为⽆关代码的清除。下⾯是Test.i⽂件的最后部分,可以看见宏的替换和注释的消除。
[cpp]
1. # 5 "Test.cpp" 2
gnu编译器2.
3. static int t = 1;
4.
5. using namespace std;
6.
7. typedef int Status;
8.
9. int main()
10. {
11.  Status i = 1;
12.  cout << 9 * i << endl;
13.  return 0;
14. }
2.将预处理后的⽂件不转换成汇编语⾔,⽣成⽂件.s[编译器egcs]
命令:g++ -S Test.cpp
功能:会⽣成Test.s⽂件,.s⽂件表⽰是汇编⽂件,⽤编辑器打开就都是汇编指令。
3.有汇编变为⽬标代码(机器代码)⽣成.o的⽂件[汇编器as]
命令:g++ -c Test.cpp
功能:.o是GCC⽣成的⽬标⽂件,除⾮你是做编译器和连接器调试开发的,否则打开这种.o没有任何意义。⼆进制机器码⼀般⼈也读不了。
4.连接⽬标代码,⽣成可执⾏程序[链接器ld]
命令:g++ Test.o -L F:\vs2008\VC\include\iostream
功能:将.o⽂件与所需的库⽂件链接整合形成.exe⽂件,这就是可执⾏⽂件。-L 表⽰链接,这⾥我后⾯写的是绝对路径,相对各⼈电脑不同
在上⾯各个步骤中你可以⽤-o命令输出你⾃⼰想要的各种名字。⽐如最后⼀个命令,⽤下⾯的输出
你可以g++ Test.o - -L F:\vs2008\VC\include\iostream
==================================================================================================== gcc and g++分别是gnu的c & c++编译器 gcc/g++在执⾏编译⼯作的时候,总共需要4步
1.预处理,⽣成.i的⽂件[预处理器cpp]
2.将预处理后的⽂件转换成汇编语⾔,⽣成⽂件.s[编译器egcs]
3.由汇编变为⽬标代码(机器代码)⽣成.o的⽂件[汇编器as]
4.连接⽬标代码,⽣成可执⾏程序[链接器ld]
[参数详解]
-x language filename
 设定⽂件所使⽤的语⾔,使后缀名⽆效,对以后的多个有效.也就是根据约定C语⾔的后缀名称是.c的,⽽C++的后缀名是.C或者.cpp,如果你很个性,决定你的C代码⽂件的后缀名是.pig 哈哈,那你就要⽤这个参数,这个参数对他后⾯的⽂件名都起作⽤,除⾮到了下⼀个参数的使⽤。
  可以使⽤的参数吗有下⾯的这些
  `c', `objective-c', `c-header', `c++', `cpp-output', `assembler', and `assembler-with-cpp'.
  看到英⽂,应该可以理解的。
  例⼦⽤法:
  gcc -x c hello.pig
-x none filename
  关掉上⼀个选项,也就是让gcc根据⽂件名后缀,⾃动识别⽂件类型
  例⼦⽤法:
  gcc -x c hello.pig -x none hello2.c
-c
  只激活预处理,编译,和汇编,也就是他只把程序做成obj⽂件
  例⼦⽤法:
  gcc -c hello.c
  他将⽣成.o的obj⽂件
-S
  只激活预处理和编译,就是指把⽂件编译成为汇编代码。
  例⼦⽤法
  gcc -S hello.c
  他将⽣成.s的汇编代码,你可以⽤⽂本编辑器察看
-E
  只激活预处理,这个不⽣成⽂件,你需要把它重定向到⼀个输出⽂件⾥⾯.
  例⼦⽤法:
  gcc -E hello.c >
  gcc -E hello.c | more
  慢慢看吧,⼀个hello word 也要与处理成800⾏的代码
-o
  制定⽬标名称,缺省的时候,gcc 编译出来的⽂件是a.out,很难听,如果你和我有同感,改掉它,哈哈
  例⼦⽤法
  gcc - hello.c (哦,windows⽤习惯了)
  gcc -o hello.asm -S hello.c
-pipe
  使⽤管道代替编译中临时⽂件,在使⽤⾮gnu汇编⼯具的时候,可能有些问题
  gcc -pipe - hello.c
-ansi
  关闭gnu c中与ansi c不兼容的特性,激活ansi c的专有特性(包括禁⽌⼀些asm inline typeof关键字,以及UNIX,vax等预处理宏, -fno-asm
  此选项实现ansi选项的功能的⼀部分,它禁⽌将asm,inline和typeof⽤作关键字。   
-fno-strict-prototype
  只对g++起作⽤,使⽤这个选项,g++将对不带参数的函数,都认为是没有显式的对参数的个数和类型说明,⽽不是没有参数.
  ⽽gcc⽆论是否使⽤这个参数,都将对没有带参数的函数,认为城没有显式说明的类型
-fthis-is-varialble
  就是向传统c++看齐,可以使⽤this当⼀般变量使⽤.
-fcond-mismatch
  允许条件表达式的第⼆和第三参数类型不匹配,表达式的值将为void类型
-funsigned-char
-fno-signed-char
-fsigned-char
-fno-unsigned-char
  这四个参数是对char类型进⾏设置,决定将char类型设置成unsigned char(前两个参数)或者 signed char(后两个参数)
-include file
  包含某个代码,简单来说,就是便以某个⽂件,需要另⼀个⽂件的时候,就可以⽤它设定,功能就相当于在代码中使⽤#include<filename>  例⼦⽤法:
  gcc hello.c -include /root/pianopan.h
-imacros file
  将file⽂件的宏,扩展到gcc/g++的输⼊⽂件,宏定义本⾝并不出现在输⼊⽂件中
-Dmacro
  相当于C语⾔中的#define macro
-Dmacro=defn
  相当于C语⾔中的#define macro=defn
-Umacro
  相当于C语⾔中的#undef macro
-undef
  取消对任何⾮标准宏的定义
-Idir
  在你是⽤#include"file"的时候,gcc/g++会先在当前⽬录查你所制定的头⽂件,如果没有到,他回到缺省的头⽂件⽬录,如果使⽤-I 制定了⽬录,他
  回先在你所制定的⽬录查,然后再按常规的顺序去.
  对于#include<file>,gcc/g++会到-I制定的⽬录查,查不到,然后将到系统的缺省的头⽂件⽬录查
-I-
  就是取消前⼀个参数的功能,所以⼀般在-Idir之后使⽤
-idirafter dir
  在-I的⽬录⾥⾯查失败,讲到这个⽬录⾥⾯查.
-iprefix prefix
-iwithprefix dir
  ⼀般⼀起使⽤,当-I的⽬录查失败,会到prefix+dir下查
-nostdinc
  使编译器不再系统缺省的头⽂件⽬录⾥⾯头⽂件,⼀般和-I联合使⽤,明确限定头⽂件的位置
-nostdin C++
  规定不在g++指定的标准路经中搜索,但仍在其他路径中搜索,.此选项在创libg++库使⽤
-C
  在预处理的时候,不删除注释信息,⼀般和-E使⽤,有时候分析程序,⽤这个很⽅便的
-
M
  ⽣成⽂件关联的信息。包含⽬标⽂件所依赖的所有源代码你可以⽤gcc -M hello.c来测试⼀下,很简单。 
-MM
  和上⾯的那个⼀样,但是它将忽略由#include<file>造成的依赖关系。
-MD
  和-M相同,但是输出将导⼊到.d的⽂件⾥⾯
-MMD
  和-MM相同,但是输出将导⼊到.d的⽂件⾥⾯
-Wa,option
  此选项传递option给汇编程序;如果option中间有逗号,就将option分成多个选项,然后传递给会汇编程序
-Wl.option
  此选项传递option给连接程序;如果option中间有逗号,就将option分成多个选项,然后传递给会连接程序. 
-llibrary
  制定编译的时候使⽤的库
  例⼦⽤法
  gcc -lcurses hello.c
  使⽤ncurses库编译程序
-Ldir
  制定编译的时候,搜索库的路径。⽐如你⾃⼰的库,可以⽤它制定⽬录,不然
  编译器将只在标准库的⽬录。这个dir就是⽬录的名称。
-O0
-O1
-O2
-O3
  编译器的优化选项的4个级别,-O0表⽰没有优化,-O1为缺省值,-O3优化级别最⾼   
-g
  只是编译器,在编译的时候,产⽣调试信息。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。