g ++和gcc有什么区别?哪些应该用于一般的c ++开发?
gcc
并且g++
是GNU Compiler Collection的编译器驱动程序(曾经只是GNU C编译器).
即使它们cc1
cc1plus
根据文件类型自动确定调用哪个后端(...),除非被覆盖,否则-x language
它们会有一些差异.
默认情况下可能最重要的区别是它们自动链接的库.
根据GCC的在线文档链接选项以及如何调用g ++,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文件的预定义宏较少.
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
对于c ++,你应该使用g ++.
它是相同的编译器(例如GNU编译器集合).GCC或G ++只选择具有不同默认选项的不同前端.
简而言之:如果使用g ++,前端会告诉链接器您可能希望链接到C++标准库.gcc前端不会这样做(如果传递正确的命令行选项,它也可以与它们链接).
g++
和之间有什么区别gcc
?
gcc
已经从单一语言"GNU C Compiler"发展成为多语言"GNU编译器集合".术语"GNU C编译器"有时仍在C编程的上下文中使用.
这g++
是 GNU Compiler Collection的C++编译器.就像gnat
Ada编译器一样gcc
.请参阅使用GNU编译器集合(GCC)
例如,Ubuntu 16.04和18.04 man g++
命令返回GCC(1)
手册页.
Ubuntu 16.04和18.04 man gcc
声明......
g++
接受大多数相同的选项gcc
那是默认的......
...使用
gcc
不添加C++库.g++
是一个调用GCC并自动指定与C++库链接的程序.除非使用-x,否则它将.c,.h和.i文件视为C++源文件而不是C源文件.当预编译具有.h扩展名的C头文件以用于C++编译时,此程序也很有用.
搜索gcc
上的选择差异风俗细节手册页gcc
和g++
.
哪一个应该用于一般的c ++开发?
从技术上讲,可以使用gcc
或g++
可以使用适用的选项设置进行常规C++开发.但是,g++
默认行为自然与C++开发对齐.
Ubuntu 18.04手册页添加了以下段落:
运行GCC的常用方法是运行被调用的可执行文件
gcc
,或者machine-gcc
在交叉编译时machine-gcc-version
运行,或运行特定版本的GCC. 编译C++程序时,应该调用GCCg++
.
唯一值得注意的区别是,如果你传递.c
给gcc它将编译为C,而g ++将始终将其视为C++.
虽然gcc和g ++命令做的事情很相似,但g ++被设计成你调用编译C++程序的命令.它旨在自动做正确的事情.
在幕后,他们真的是同一个节目.据我所知,两者都决定是根据文件扩展名将程序编译为C还是C++.两者都能够链接到C++标准库,但只有g ++默认执行此操作.因此,如果您有一个用C++编写的程序,并不需要链接到标准库,那么gcc就会做正确的事情; 但是,g ++也是如此.因此,没有理由不使用g ++进行一般的C++开发.
我开始对这个问题感兴趣并进行一些实验
我在这里找到了描述,但它很短.
然后我尝试在我的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简单的测试文件,它对我来说很有用,正确的扩展名匹配语言
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编译器集合"工具时:
$ 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
ps测试文件
$ 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 #includeenum class Color : int{red,green,blue}; // scoped enum int main() { std::vector a {1,2,3}; // bracket initialization return 0; }
发现:
如果查看进程树,那么似乎gcc和g ++是后端到其他工具,在我的环境中是:cc1plus.exe,cc1.exe,collect2.exe,as.exe,ld.exe
如果你有正确的扩展名或设置正确的-std -x标志,gcc作为metatool工作正常.看到这个
"GCC"是GNU Compiler Collection的常用简写术语.这是编译器的最通用名称,以及强调编译C程序时使用的名称(缩写以前代表"GNU C编译器").
在引用C++编译时,通常调用编译器"G ++".由于只有一个编译器,无论语言环境如何,将其称为"GCC"也是准确的; 但是,当重点是编译C++程序时,术语"G ++"更有用.
你可以在这里阅读更多.