gcc和g++是什么

gcc和g++区别介绍

GCC:GNU Compiler Collection(GUN 编译器集合),它可以编译C、C++、JAV、Fortran、Pascal、Object-C、Ada等语言。

gcc 是GCC中的GUN C Compiler(C 编译器)

g++ 是GCC中的GUN C++ Compiler(C++编译器)

通常习惯使用gcc编译c语言程序,使用g++编译c++语言程序;

所以可以说gcc调用了C compiler,而g++调用了C++ compiler;

  • 对于 .c和.cpp文件,gcc分别当做c和cpp文件编译
  • 对于 .c和.cpp文件,g++则统一当做cpp文件编译
  • 使用g++编译文件时,g++会自动链接标准库STL,而gcc不会自动链接STL

gcc是GCC编译器的通用编译指令,可以通过文件后缀名选择编译标准,比如:

xxx.c:默认以编译 C 语言程序的方式编译;

xxx.cpp:默认以编译 C++ 程序的方式编译;

xxx.go:默认以编译 Go 语言程序的方式编译;

gcc指令也可以通过选项-x显示指定编译语言,比如:

gcc -xc xxx.c : 表示以c语言标准编译

gcc -xc++ xxx.c : 表示以c++语言标准编译

gcc编译c++代码时无法自动链接标准库文件(比如:#include <string>),需要通过选项lstdc++ -shared-libgcc链接

gcc -xc++ -lstdc++ -shared-libgcc xxx.cpp

g++指令同样可以编译c语言程序,但g++指令编译c程序时一律按c++代码标准编译

举例(hello.cpp):

1
2
3
4
5
6
7
#include <iostream>
using namespace std;
int main()
{
    cout << "Hello, world!" << endl;
    return 0;
}

使用g++编译正常,用gcc编译时则会报错:

1
2
3
> gcc hello.cpp
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

添加选项-lstdc++ -shared-libgcc编译正常

1
2
3
> gcc -xc++ -lstdc++ -shared-libgcc hello.cpp
> ./a.out
Hello, world!

举例(test.c/test.cpp):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main()
{
	FILE* file = fopen("t.txt","w+");
	if (file == NULL)
	{
		return 0;
	}

	char buf[20]="hello world!\n";
	//int len = strlen(buf);

    while(1)
    {
        fputs(buf,file);
        fflush(file);
        //printf("%s",buf);
        sleep(1);
    }

	fclose(file);

	return 0;
}

使用g++编译时会抛出警告

1
2
> g++ test.c
clang: warning: treating 'c' input as 'c++' when in C++ mode, this behavior is deprecated [-Wdeprecated]

使用g++编译cpp文件,或使用gcc编译则正常

1
2
3
> g++ test.cpp
> gcc test.c
> gcc test.cpp

gcc也可以编译golang程序,使用gccgo来编译golang程序

参考