Linux——gcc & g++的使用和区别
gcc和g++
gcc和g++都是编译器。编译代码用的!
别看他俩长得差不多,但是他俩是不同的。
gcc和g++的区别
gcc和g++都来自一个妈:GNU 编译器集合
gcc是GCC中的GUN C Compiler(C 编译器)
g++是GCC中的GUN C++ Compiler(C++编译器)
误区一:gcc只能编译C代码,g++只能编译c++代码。
事实上,二者都可以编译c或cpp文件。
gcc和g++的主要区别
对于 .c和.cpp文件,gcc分别当做c和cpp文件编译(cpp的语法规则比c的更强一些)
对于 .c和.cpp文件,g++则统一当做cpp文件编译
g++相当于gcc -xc++ -lstdc++ -shared-libgcc
注:对于其他不同的后缀名,gcc编译方式都不同
- xxx.m:默认以编译 Objective-C 程序的方式编译此文件;
- xxx.go:默认以编译 Go 语言程序的方式编译此文件;
误区二:编译只能使用gcc,连接只能使用g++
这句话混淆了概念。编译可以用 gcc 或 g++,而链接可以用 g++ 或者 gcc-lstdc++。
因为 gcc 命令不能自动和 C++ 库链接,所以通常使用 g++ 来完成链接。
但在编译阶段,g++ 会自动调用 gcc,二者等价。
<mark>在编译阶段,g++会调用gcc,对于c++代码,两者是等价的,但是因为gcc命令不能自动和C++程序使用的库联接,所以通常用g++来完成链接</mark>
为了统一起见,干脆编译/链接统统用g++了,这就给人一种错觉,好像cpp程序只能用g++似的。
误区三:extern “C” 与 gcc/g++ 有关系
实际上并无关系,
无论是 gcc 还是 g++,用 extern “c” 时,都是以 C 的命名方式来为symbol 命名,
否则,都以 C++ 方式为函数命名。
误区四:gcc不会定义__cplusplus宏,而g++会
实际上,这个宏只是标志着编译器将会把代码按C还是C++语法来解释,如上所述,如果后缀为.c,并且采用gcc编译器,则该宏就是未定义的,否则,就是已定义。
gcc在编译.c文件时,可使用的预定义宏是比较少的,很多都是未定义的。
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
gcc和g++的使用
gcc和g++的使用都没区别,所以我只罗列gcc的使用了。绝对不是因为我懒!
gcc (选项)(参数)
gcc -c 只编译,不链接成可执行文件,生成.o为后缀的目标文件
gcc -o 输出文件 源文件 生成可执行文件,如果输出文件名为指定,默认a.out
gcc -g 产生符号调试工具
gcc -O(大写) 对程序进行优化编译链接
gcc -O2 更好的优化
gcc -E 预编译后停下来,生成后缀为 .i 的预编译文件。
gcc -S 汇编后停下来,生成后缀为 .s 的汇编源文件。
参考文献
[1]测试蝈蝈.gcc的使用简介及参数说明.博客园.
[2]wsqyouth.gcc和g++的区别.CSDN.2018.05.07