g ++和gcc有什么区别?
g ++和gcc有什么区别? 哪些应该用于一般的c ++开发?
gcc
和g++
是“Gnu编译器集合 ”的编译器驱动程序(曾经是“Gnu C编译器 ”)。
即使它们自动确定根据文件types调用哪个后端( cc1
cc1plus
…),除非用-x language
覆盖,它们有一些差异。
它们的默认值可能最重要的区别是它们自动链接的库。
根据[1]和[2] , g++
等同于gcc -xc++ -lstdc++ -shared-libgcc
(第一个是编译器选项,第二个是链接器选项)。 这可以通过运行-v
选项来检查(它显示正在运行的后端工具链命令)。
GCC:GNU编译器集合
- 推荐给GNU编译器支持的所有不同的语言。
gcc:GNU C编译器
g ++:GNU C ++编译器
主要区别:
- gcc将分别编译:* .c / * .cpp文件,分别为C和C ++。
- g ++将会编译:* .c / *。cpp文件,但是它们都将被视为C ++文件。
- 另外如果你使用g ++来链接目标文件,它会自动链接到std C ++库(gcc不这样做)。
- gcc编译C文件的预定义macros较less。
- gcc编译* .cpp和g ++编译* .c / *。cpp文件有一些额外的macros。
编译* .cpp文件时额外的macros:
#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 ++只是select不同的默认选项不同的前端。
简而言之,如果您使用g ++,前端会告诉链接器您可能想要链接到C ++标准库。 gcc前端不会这样做(如果你传递正确的命令行选项,也可以和它们链接)。
尽pipegcc和g ++的命令做了非常相似的事情,但是g ++被devise成你要编译C ++程序的命令; 它的目的是自动做正确的事情。
在幕后,他们真的是同一个节目。 据我所知,这两个决定是否编译程序为C或C + +基于文件扩展名。 两者都能够链接到C ++标准库,但只有g ++默认这样做。 所以,如果你有一个用C ++编写的程序,不需要和标准库链接,gcc就会做正确的事情; 但是,那么g ++也是如此。 所以没有理由不使用g ++来进行一般的C ++开发。
“GCC”是GNU Compiler Collection的常用术语。 这是编译器最通用的名称,也是编译C程序时使用的名称(以前的缩写代表“GNU C编译器”)。
引用C ++编译时,通常会调用编译器“G ++”。 由于只有一个编译器,因此无论语言环境如何,将其称为“GCC”也是准确的。 然而,当强调编译C ++程序时,术语“G ++”更为有用。
你可以在这里阅读更多。
我对这个问题产生了兴趣并进行了一些实验
-
我在这里find了描述,但是很短。
-
然后我尝试在我的Windows机器上使用gcc.exe和g ++。exe:
$ 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简单的testing文件,而且对于我来说正确的扩展匹配语言
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 compiler collection”工具时:
$ 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]
-
但是这个工作仍然没有错误
$ gcc -x c++ -std=c++98 test_cpp.c
-
而且这也是
$ g++ -std=c++0x test_cpp_11.cpp
pstesting文件
$ 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
-
如果你有正确的扩展名或正确的-std -x标志,gcc可以正常工作。 看到这个
唯一显着的区别是,我将.c传递给gcc它将编译为C,而g ++将始终将它视为C ++
g++
和gcc
什么区别?
gcc
已经从单一语言“GNU C编译器”发展成为一个多语言的“GNU编译器集合”。 在C编程中,“GNU C编译器”这个术语有时仍然用到。
g++
是 GNU编译器集合的C ++编译器。 像gnat
是gcc
的Ada编译器。 请参阅使用GNU编译器集合(GCC)
例如在Ubuntu 16.04上, man g++
返回GCC(1)
手册页。
该man gcc
指出,…
g++
主要接受与gcc
相同的选项
并默认…
…使用
gcc
不会添加C ++库。g++
是一个调用GCC并自动指定与C ++库链接的程序。 它将.c,.h和.i文件视为C ++源文件,而不是C源文件,除非使用-x。 预编译带有.h扩展名的C头文件以用于C ++编译时,此程序也很有用。
在gcc
手册页上查找关于gcc
和g++
的选项差异的更多细节。
哪一个应该用于一般的C ++开发?
gcc
或g++
都可以用于通用的C ++开发和适用的选项设置。 但是, g++
默认行为更自然地与C ++中心开发alignment。
gcc和g ++都是GNU编译器。 他们都编译c和c ++。 不同之处在于* .c文件,gcc把它当作交stream程序,g ++把它看作是ac ++程序。 * .cpp文件被认为是c ++程序。 c ++是c的超集,而且语法比较严格,所以要注意后缀。
我正在linux系统中testinggcc和g ++。 通过使用MAKEFILE,我可以定义“GNU make”使用的编译器。 我用所谓的“dynamic内存”定位function“C plus plus”进行testing:
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 + plus”。 看来selectg ++的C ++源文件是一个更好的select。