g和gcc有什么区别?哪些应该用于一般的c开发?
I became interested in the issue and perform some experiments
我发现描述here,但它很短 .
然后我尝试在我的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
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
$ 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
附:测试文件
$ 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; }
Findings:
如果你有正确的扩展名或设置正确的-std -x标志,
What is the difference between g++ and gcc?
gcc 已从单一语言"GNU C Compiler"演变为多语言"GNU Compiler Collection" . 术语"GNU C Compiler"有时仍在C编程的上下文中使用 .
gcc
g++ 是GNU编译器集合的C编译器 . 像 gnat 是 gcc 的Ada编译器 . see Using the GNU Compiler Collection (GCC)
g++
gnat
例如,Ubuntu 16.04和18.04 man g++ 命令返回 GCC(1) 手册页 .
man g++
GCC(1)
Ubuntu 16.04和18.04 man gcc 表示......
man gcc
g接受与gcc大致相同的选项
那是默认的......
...使用gcc不会添加C库 . g是一个调用GCC并自动指定与C库链接的程序 . 它将.c,.h和.i文件视为C源文件而不是C源文件,除非使用-x . 当预编译具有.h扩展名的C头文件以在C编译中使用时,此程序也很有用 .
在 gcc 手册页中搜索有关 gcc 和 g++ 的选项差异的详细信息 .
Which one should be used for general c++ development?
从技术上讲, gcc 或 g++ 可用于通用C开发,并带有适用的选项设置 . 但是, g++ 默认行为自然与C开发对齐 .
Ubuntu 18.04手册页添加了以下段落:
运行GCC的常用方法是在交叉编译时运行名为gcc的可执行文件或machine-gcc,或运行特定版本的GCC的machine-gcc-version . 编译C程序时,应该将GCC调用为g .
唯一值得注意的区别是,如果将 .c 传递给gcc,它将编译为C,而g将始终将其视为C .
.c
我在linux系统中测试gcc和g . 通过使用MAKEFILE,我可以定义“GNU make”使用的compliler . 我测试了所谓的“动态记忆”定位功能“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 plus plus" . It seems that choosing g++ for C++ source files is a better option.
GCC: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和g命令的功能非常相似,但g被设计为您调用编译C程序的命令 . 它旨在自动做正确的事情 .
在幕后,他们真的是同一个节目 . 据我所知,两者都决定是根据文件扩展名将程序编译为C还是C . 两者都能够链接到C标准库,但只有g默认情况下这样做 . 因此,如果您有一个用C编写的程序,并不需要链接到标准库,那么gcc就会做正确的事情;但是,那么g . 因此,没有理由不将g用于一般的C开发 .
gcc和g都是GNU编译器 . 他们都编译c和c . 区别在于* .c文件gcc将其视为c程序,g将其视为c程序 . * .cpp文件被认为是c程序 . c是c的超集,语法更严格,所以要小心后缀 .
“GCC”是GNU Compiler Collection的常用简写术语 . 这是编译器的最通用名称,以及强调编译C程序时使用的名称(缩写以前代表“GNU C编译器”) .
在引用C编译时,通常会调用编译器“G ” . 由于只有一个编译器,无论语言环境如何,将其称为“GCC”也是准确的;但是,当重点是编译C程序时,术语“G”更有用 .
你可以阅读更多here .
gcc 和 g++ 是GNU Compiler Collection的编译器驱动程序(曾经只是GNU C编译器) .
即使它们根据文件类型自动确定要调用哪些后端( cc1 cc1plus ...),除非被 -x language 覆盖,否则它们会有一些差异 .
cc1
cc1plus
-x language
默认情况下可能最重要的区别是它们自动链接的库 .
根据GCC的在线文档link options和how g++ is invoked, g++ 相当于 gcc -xc++ -lstdc++ -shared-libgcc (第一个是编译器选项,第二个是链接器选项) . 这可以通过使用 -v 选项运行来检查(它显示正在运行的后端工具链命令) .
gcc -xc++ -lstdc++ -shared-libgcc
-v
对于c你应该使用g .
它是相同的编译器(例如GNU编译器集合) . GCC或G只选择具有不同默认选项的不同前端 .
简而言之:如果使用g,前端将告诉链接器您可能想要与C标准库链接 . gcc前端不会这样做(如果你传递正确的命令行选项,它也可以与它们链接) .
10 回答
I became interested in the issue and perform some experiments
我发现描述here,但它很短 .
然后我尝试在我的Windows机器上试验gcc.exe和g .exe:
附:测试文件
Findings:
如果你有正确的扩展名或设置正确的-std -x标志,
What is the difference between g++ and gcc?
gcc
已从单一语言"GNU C Compiler"演变为多语言"GNU Compiler Collection" . 术语"GNU C Compiler"有时仍在C编程的上下文中使用 .g++
是GNU编译器集合的C编译器 . 像gnat
是gcc
的Ada编译器 . see Using the GNU Compiler Collection (GCC)例如,Ubuntu 16.04和18.04
man g++
命令返回GCC(1)
手册页 .Ubuntu 16.04和18.04
man gcc
表示......那是默认的......
在
gcc
手册页中搜索有关gcc
和g++
的选项差异的详细信息 .Which one should be used for general c++ development?
从技术上讲,
gcc
或g++
可用于通用C开发,并带有适用的选项设置 . 但是,g++
默认行为自然与C开发对齐 .Ubuntu 18.04手册页添加了以下段落:
唯一值得注意的区别是,如果将
.c
传递给gcc,它将编译为C,而g将始终将其视为C .我在linux系统中测试gcc和g . 通过使用MAKEFILE,我可以定义“GNU make”使用的compliler . 我测试了所谓的“动态记忆”定位功能“C plus plus”:
只有g才能在我的计算机上成功编译,而gcc将报告错误
所以我自己的结论是gcc并不完全支持"C plus plus" . It seems that choosing g++ for C++ source files is a better option.
GCC: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文件时的额外宏:
尽管gcc和g命令的功能非常相似,但g被设计为您调用编译C程序的命令 . 它旨在自动做正确的事情 .
在幕后,他们真的是同一个节目 . 据我所知,两者都决定是根据文件扩展名将程序编译为C还是C . 两者都能够链接到C标准库,但只有g默认情况下这样做 . 因此,如果您有一个用C编写的程序,并不需要链接到标准库,那么gcc就会做正确的事情;但是,那么g . 因此,没有理由不将g用于一般的C开发 .
gcc和g都是GNU编译器 . 他们都编译c和c . 区别在于* .c文件gcc将其视为c程序,g将其视为c程序 . * .cpp文件被认为是c程序 . c是c的超集,语法更严格,所以要小心后缀 .
“GCC”是GNU Compiler Collection的常用简写术语 . 这是编译器的最通用名称,以及强调编译C程序时使用的名称(缩写以前代表“GNU C编译器”) .
在引用C编译时,通常会调用编译器“G ” . 由于只有一个编译器,无论语言环境如何,将其称为“GCC”也是准确的;但是,当重点是编译C程序时,术语“G”更有用 .
你可以阅读更多here .
gcc
和g++
是GNU Compiler Collection的编译器驱动程序(曾经只是GNU C编译器) .即使它们根据文件类型自动确定要调用哪些后端(
cc1
cc1plus
...),除非被-x language
覆盖,否则它们会有一些差异 .默认情况下可能最重要的区别是它们自动链接的库 .
根据GCC的在线文档link options和how g++ is invoked,
g++
相当于gcc -xc++ -lstdc++ -shared-libgcc
(第一个是编译器选项,第二个是链接器选项) . 这可以通过使用-v
选项运行来检查(它显示正在运行的后端工具链命令) .对于c你应该使用g .
它是相同的编译器(例如GNU编译器集合) . GCC或G只选择具有不同默认选项的不同前端 .
简而言之:如果使用g,前端将告诉链接器您可能想要与C标准库链接 . gcc前端不会这样做(如果你传递正确的命令行选项,它也可以与它们链接) .