gcc和g++

1.GCC、gcc、g++


  gcc和GCC是两个不同的东西:

    GCC:GNU Compiler Collection(GUN 编译器集合),它可以编译C、C++、JAV、Fortran、Pascal、Object-C、Ada等语言。

    gcc:GCC中的GUN C Compiler(C 编译器)。

    g++:GCC中的GUN C++ Compiler(C++编译器)

  就本质而言,gcc和g++并不是编译器,也不是编译器的集合,它们只是一种驱动器,根据参数中要编译的文件的类型,调用对应的GUN编译器而已。比如,用gcc编译一个c文件的话,会有以下几个步骤:

    Step1:调用预处理器,例如CPP(C Pre-Processor)。

    Step2:调用一个实际的编译器,例如 cc 或者 cc1。

    Step3:调用汇编程序,例如as。

    Step4:调用链接器,例如ld。

  所以,更准确的说法是:gcc调用了C compiler,而g++调用了C++ compiler。另外gcc/g++根据编译选项可以只执行上面中的其中一个(或几个)步骤。

2.gcc和g++的区别


  [1]对于 *.c和*.cpp文件,gcc分别当做c和cpp文件编译,而g++则统一当做cpp文件编译。

  [2]使用g++编译文件时,g++会自动链接标准库STL,而gcc不会自动链接STL。

  [3]gcc在编译cpp文件和g++在编译c文件和cpp文件时(这时候gcc和g++调用的都是cpp文件的编译器),会加入一些额外的宏,这些宏如下:

#define __GXX_WEAK__ 1
#define __cplusplus 1
#define __DEPRECATED 1
#define __GNUG__ 4
#define __EXCEPTIONS 1
#define __private_extern__ extern

  [4]在用gcc编译c++文件时,为了能够使用STL,需要加参数 –lstdc++,所以一般使用gcc编译的文件有.cpp时就会加此选项。

  [5]gcc不能链接由g++编译的库文件。

3.gcc编译选项


  -g,生成供调试用的可执行文件,因此可以在gdb中显示详细符号信息。由于文件中包含了调试信息因此运行效率会降低,且文件也大不少。

  -Wall,显示大多数警告信息(Enable most warning messages)

  -O0、-O1、-O2、-O3,编译器的优化选项的4个级别,-O0表示没有优化,-O3优化级别最高。因此使用-O0时会非常影响程序性能。

  -Idir,指定查找头文件的目录。  

  -Ldir,指定搜索库的路径。

  -llibrary,指定编译的时候使用的库。(注意只是编译,如果是运行时查找动态库,则不会查找个选项指定的路径)

  -rdynamic,指示连接器把所有符号(而不仅仅只是程序已使用到的外部符号,但不包括静态符号)都添加到动态符号表(即.dynsym表)里,以便dlopen()等函数使用。

 

posted on 2019-03-20 16:01  能量星星  阅读(396)  评论(0编辑  收藏  举报

导航