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文件的编译器),会加入一些额外的宏,这些宏如下:
1 2 3 4 5 6 | #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()等函数使用。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步