g++和gcc之间有什么区别
What is the difference between g++ and gcc?
g++和gcc之间有什么区别?它们中的哪一个应该用于一般的c++开发?
gcc
和g++
是GNU编译器集合的编译器驱动程序(它曾经只是GNU编译器)。
尽管它们会根据文件类型自动确定要调用哪些后端(cc1
cc1plus
…),但除非用-x language
重写,否则它们会有一些差异。
它们默认值中最重要的区别可能是它们自动链接到哪些库。
根据GCC的在线文档链接选项以及g++的调用方式,g++
大致相当于gcc -xc++ -lstdc++ -shared-libgcc
(第一个是编译器选项,第二个是链接器选项)。这可以通过使用-v
选项运行两者来检查(它显示正在运行的后端工具链命令)。
默认情况下(与gcc
不同),g++还添加了链接器选项-lm
-来链接包含math.h
实现的libm
。
GCC:GNU编译器集合
- 指GNU编译器支持的所有不同语言
gcc
:GNU C编译器g++
:GNU C++编译器
主要区别:
gcc
将把*.c*.cpp
文件分别编译为C和C++g++
将编译:*.c*.cpp
文件,但它们都将被视为C++文件- 此外,如果使用
g++
链接对象文件,则它会自动链接到std C++库中(gcc
不执行此操作) - 编译C文件的
gcc
具有较少的预定义宏 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
之间有什么区别
CCD_ 29已经从单一语言";GNU C编译器";成为一种多语言";GNU编译器集合";。术语CCD_;GNU C编译器";在C编程的背景下。
man gcc
# GCC(1) GNU
#
# NAME
# gcc - GNU project C and C++ compiler
但是,g++
是GNU编译器集合的C++编译器。与gnat
类似的是gcc
的Ada编译器。请参阅使用GNU编译器集合(GCC)
例如,Ubuntu 16.04和18.04 man g++
命令返回GCC(1)
手册页。
Ubuntu 16.04和18.04 man gcc
声明。。。
g++
接受与gcc
基本相同的选项
并且默认。。。
使用CCD_ 39不会添加C++库。
g++
是一个程序调用GCC并自动指定针对C的链接++图书馆它将.c、.h和.i文件视为c++源文件,而不是C源文件,除非使用-x。此程序在以下情况下也很有用预编译扩展名为.h的C头文件以在C中使用++汇编。
有关gcc
和g++
之间选项差异的更多详细信息,请搜索gcc
手册页。
一般的c++开发应该使用哪一个
从技术上讲,gcc
或g++
都可以用于具有适用选项设置的通用C++开发。然而,g++
默认行为自然与C++开发保持一致。
Ubuntu 18.04的"gcc"手册页添加了,Ubuntu 20.04继续有以下段落:
运行GCC的常用方法是运行名为
gcc
的可执行文件,或者在交叉编译时运行machine-gcc
,或者运行特定版本的GCC的machine-gcc-version
编译C++程序时,应将GCC调用为g++
旁注:在Xcode.app嵌入式工具链的情况下,g++
只是链接到gcc
因此,g++
调用可能因每个工具链而异
ls -l /Applications/Xcode.app/Contents/Developer/usr/bin
# …
# lrwxr-xr-x 1 root wheel 3 Apr 27 2021 g++ -> gcc
# -rwxr-xr-x 1 root wheel 167120 Nov 23 20:51 gcc
### -- versus --
which -a g++
# /usr/bin/g++
ls -l /usr/bin/g++
# -rwxr-xr-x 1 root wheel 137616 Jan 1 2020 /usr/bin/g++
一个显著的区别是,如果将.c
文件传递给gcc,它将编译为C.
g++的默认行为是将.c
文件视为C++(除非指定了-x 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
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标志。查看此
"GCC"是GNU编译器集合的常用缩写术语。这既是编译器最通用的名称,也是强调编译C程序时使用的名称(缩写以前代表"GNU C编译器")。
当提到C++编译时,通常将编译器称为"G++"。由于只有一个编译器,因此无论语言上下文如何,将其称为"GCC"也是准确的;然而,当重点是编译C++程序时,术语"G++"更有用。
你可以在这里阅读更多。
我在linux系统中测试gcc和g++。通过使用MAKEFILE,我可以定义"GNU make"使用的编译器。我测试了所谓的"动态内存"定位功能的"C++"通过:
int main(){
int * myptr = new int;
* myptr = 1;
printf("myptr[0] is %in",*myptr);
return 0;
}
只有g++可以在我的计算机上成功编译,而gcc将报告错误
undefined reference to `operator new(unsigned long)'
所以我自己的结论是gcc并不完全支持"C plus plus"似乎为C++源文件选择g++是一个更好的选择
gcc和g++都是GNU编译器。它们都编译c和c++。不同的是,对于*.c文件,gcc将其视为c程序,而g++则将它视为c++程序。cpp文件被认为是c++程序。c++是c的超级集合,语法更严格,所以要小心后缀。
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- Qt:remove() 和 rmdir() 有什么区别
- 这 4 个 lambda 表达式之间有什么区别?
- 将向量作为类>(值)<向量启动和向量<类>[值]有什么区别
- typedef 枚举和枚举类有什么区别?
- &C::c 和 &(C::c) 有什么区别?
- ascii 和 unicode 在处理级别有什么区别吗?
- C 中的常量限定符和 C++ 中的常量限定符有什么区别?
- "ABC" 和 "ABC" ) 在C++中有什么区别?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 引用捕获和在 lambda 中通过引用发送参数有什么区别 (C++)
- 两种访问I2C总线的方法有什么区别?
- 两种模板示例有什么区别?
- 这两种C++语法之间有什么区别?
- lua 5.0.2 模块和 5.3.5 有什么区别?
- C++中"typedef"、"using"、"namespace"和"using namespace"有什么区别?
- std::enable_if 和 std::enable_if_t 有什么区别?