g++和gcc的区别是什么?它们中的哪一个应该用于一般的c++开发?
当前回答
gcc和g++是GNU编译器集合(曾经只是GNU C编译器)的编译器驱动程序。
尽管它们根据文件类型自动决定调用哪个后端(cc1 cc1plus…),但它们还是有一些不同之处,除非使用-x语言重写。
它们默认值中最重要的区别可能是它们自动链接到哪些库。
根据GCC的在线文档链接选项和g++的调用方式,g++等价于GCC -xc++ -lstdc++ -shared-libgcc(第一个是编译器选项,第二个是链接器选项)。这可以通过运行-v选项来检查(它会显示正在运行的后端工具链命令)。
其他回答
gcc和g++是GNU编译器集合(曾经只是GNU C编译器)的编译器驱动程序。
尽管它们根据文件类型自动决定调用哪个后端(cc1 cc1plus…),但它们还是有一些不同之处,除非使用-x语言重写。
它们默认值中最重要的区别可能是它们自动链接到哪些库。
根据GCC的在线文档链接选项和g++的调用方式,g++等价于GCC -xc++ -lstdc++ -shared-libgcc(第一个是编译器选项,第二个是链接器选项)。这可以通过运行-v选项来检查(它会显示正在运行的后端工具链命令)。
GNU编译器集合
指向GNU编译器支持的所有不同语言的引用。
gcc: GNU C编译器 g++: GNU c++编译器
主要区别:
gcc会将:*. C \*.cpp文件分别编译为C和c++。 g++将编译:*. C \*.cpp文件,但它们都将被视为c++文件。 另外,如果你使用g++来链接目标文件,它会自动链接到std c++库中(gcc不这样做)。 gcc编译C文件的预定义宏更少。 GCC编译*.cpp和g++编译*.c\*.cpp文件有一些额外的宏。
编译*.cpp文件时的额外宏:
#define __GXX_WEAK__ 1
#define __cplusplus 1
#define __DEPRECATED 1
#define __GNUG__ 4
#define __EXCEPTIONS 1
#define __private_extern__ extern
“GCC”是GNU编译器集合的常用缩写。这既是编译器最通用的名称,也是在强调编译C程序时使用的名称(作为以前代表“GNU C compiler”的缩写)。
当提到c++编译时,通常称编译器为“g++”。由于只有一个编译器,所以无论在什么语言环境中,都可以准确地称其为“GCC”;然而,当重点是编译c++程序时,术语“g++”更有用。
你可以在这里阅读更多。
我在linux系统中测试gcc和g++。通过使用MAKEFILE,我可以定义“GNU make”使用的编译器。我用“C plus plus”的所谓“动态内存”定位功能进行了测试:
int main(){
int * myptr = new int;
* myptr = 1;
printf("myptr[0] is %i\n",*myptr);
return 0;
}
只有g++可以在我的电脑上成功编译,而gcc会报错
undefined reference to `operator new(unsigned long)'
所以我自己的结论是gcc不完全支持“C + +”。对于c++源文件,选择g++似乎是一个更好的选择。
我对这个问题产生了兴趣,并做了一些实验
I found that description here, but it is very short. Then I tried to experiment with gcc.exe and g++.exe on my windows machine: $ 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 I tried to compile c89, c99, and c++1998 simple test files and It's work well for me with correct extensions matching for language 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 But when I try to run "gnu compiler collection" tool in that fashion: $ 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] But this one still work with no errors $ gcc -x c++ -std=c++98 test_cpp.c And this also $ g++ -std=c++0x test_cpp_11.cpp
p.s.测试文件
$ 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可以很好地作为元工具 -std -x标志。看到这个