What is the difference between g++ and gcc?
G++和GCC有什么区别?哪些应该用于一般的C++开发?
尽管它们根据文件类型自动确定要调用的后端(
它们默认设置中最重要的区别可能是它们自动链接的库。
根据GCC的在线文档链接选项和调用g++的方式,
gcc:GNU编译器集合
- 引用GNU编译器支持的所有不同语言。
GCC:GNU C编译器G++:GNU C++编译器
主要区别:
编译*.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 |
对于C++,你应该使用G++。
它是同一个编译器(例如GNU编译器集合)。gcc或g++只需选择具有不同默认选项的不同前端。
简而言之,如果使用G++,前端将告诉链接器,您可能希望与C++标准库链接。GCC前端不会这样做(如果您传递正确的命令行选项,它也可以与它们链接)。
EDCOX1(0)是GNU编译器集合的C++编译器。像
例如,ubuntu 16.04和18.04
Ubuntu 16.04和18.04
g++ accepts mostly the same options asgcc
默认情况是…
... use of
gcc does not add the C++ library.g++ is a program
that calls GCC and automatically specifies linking against the C++
library. It treats .c, .h and .i files as C++ source files instead of
C source files unless -x is used. This program is also useful when
precompiling a C header file with a .h extension for use in C++
compilations.
在
哪一个应该用于一般C++开发?
从技术上讲,EDCOX1×1或EDCOX1(0)可用于一般的C++开发,并具有适用的选项设置。然而,EDCOX1·0的默认行为自然地与C++开发对齐。
Ubuntu 18.04手册页添加了以下段落:
The usual way to run GCC is to run the executable called
gcc , ormachine-gcc when cross-compiling, ormachine-gcc-version to run a specific version of GCC. When you compile C++ programs, you should invoke GCC asg++ instead.
虽然GCC和G+命令做的事情非常相似,但是G++被设计成用来编译C++程序的命令;它的目的是自动地做正确的事情。
在幕后,他们真的是同一个节目。据我所知,这两种方法都是基于文件扩展名来决定是否将程序编译为C或C++。两者都可以链接到C++标准库,但默认情况下只有G++才这样做。因此,如果你有一个C++编写的程序不需要链接到标准库,GCC会碰巧做正确的事情,但是G++也会这样做。所以没有理由不使用G++来进行一般的C++开发。
唯一的显著区别是,如果你将EDCOX1的8度传递给GCC,它将被编译成C,而G+将永远把它当作C++。
我对这个问题很感兴趣,做了一些实验
我在这里找到了那个描述,但它很短。
然后我尝试在我的Windows计算机上使用gcc.exe和g++.exe进行实验:
1 2 3 4 5 | $ g++ --version | head -n1 g++.exe (gcc-4.6.3 release with patches [build 20121012 by perlmingw.sf.net]) 4.6.3 $ gcc --version | head -n1 gcc.exe (gcc-4.6.3 release with patches [build 20121012 by perlmingw.sf.net]) 4.6.3 |
我尝试编译C89、C99和C++ 1998个简单的测试文件,它对我来说是正确的扩展,适合语言的扩展。
1 2 3 4 | gcc -std=c99 test_c99.c gcc -std=c89 test_c89.c g++ -std=c++98 test_cpp.cpp gcc -std=c++98 test_cpp.cpp |
但是当我尝试以这种方式运行"GNU编译器集合"工具时:
1 2 | $ gcc -std=c++98 test_cpp.c cc1.exe: warning: command line option '-std=c++98' is valid for C++/ObjC++ but not for C [enabled by default] |
但这一个仍然没有错误
1 | $ gcc -x c++ -std=c++98 test_cpp.c |
而且这也
1 | $ g++ -std=c++0x test_cpp_11.cpp |
测试文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | $ cat test_c89.c test_c99.c test_cpp.cpp // C89 compatible file int main() { int x[] = {0, 2}; return sizeof(x); } // C99 compatible file int main() { int x[] = {[1]=2}; return sizeof(x); } // C++1998,2003 compatible file class X{}; int main() { X x; return sizeof(x); } // C++11 #include <vector> enum class Color : int{red,green,blue}; // scoped enum int main() { std::vector<int> a {1,2,3}; // bracket initialization return 0; } |
调查结果:
如果查看进程树,那么gcc和g++似乎是其他工具的后端,在我的环境中这些工具是:cc1plus.exe、cc1.exe、collect2.exe、as.exe、ld.exe
如果扩展名正确或设置正确,gcc可以作为metatool正常工作- STD -X标志。看到这个
"gcc"是GNU编译器集合的常用缩写词。这既是编译器最通用的名称,也是在重点编译C程序时使用的名称(以前的缩写是"GNUCcompiler")。
在引用C++编译时,通常调用编译器"g++"。由于只有一个编译器,所以无论语言环境如何,都可以称之为"GCC";然而,在编译C++程序时,术语"G++"更有用。
你可以在这里读更多。
我在Linux系统中测试gcc和g++。通过使用makefile,我可以定义"gnu make"使用的编译器。我使用"C Plus"的所谓"动态内存"定位功能通过以下方式进行了测试:
1 2 3 4 5 6 7 8 | int main(){ int * myptr = new int; * myptr = 1; printf("myptr[0] is %i ",*myptr); return 0; } |
只有g++可以在我的计算机上成功编译,而gcc将报告错误
1 | undefined reference to `operator new(unsigned long)' |
所以我自己的结论是GCC并不完全支持"C+plus"。对于C++源文件来说,选择G++是一个更好的选择。
gcc和g++都是GNU编译器。他们都编译C和C++。不同之处在于*.C文件GCC将它视为C程序,G++将其视为C++程序。*.CPP文件被认为是C++程序。C++是一个超级集合的C,语法更严格,所以要小心后缀。