gcc 和 g++/gcc-c++ 有啥区别?

Posted

技术标签:

【中文标题】gcc 和 g++/gcc-c++ 有啥区别?【英文标题】:What's the difference between gcc and g++/gcc-c++?gcc 和 g++/gcc-c++ 有什么区别? 【发布时间】:2011-05-02 05:16:50 【问题描述】:

在我看来gcc可以同时处理c和c++项目,那么为什么需要g++/gcc-c++呢?

g++和gcc-c++有什么区别?

【问题讨论】:

gcc-c++ 似乎不是标准的编译器名称,至少现在是这样。谷歌搜索,我得到这个问题作为实际包含该字符串的顶部链接,唯一的另一个是 rpmfind.net 上列出的包。所以我不知道它是什么......可能只是一个符号链接。 What is the difference between g++ and gcc?的可能重复 【参考方案1】:

gcc 会将 C 源文件编译为 C,如果文件具有适当的扩展名,则将 C++ 源文件编译为 C++;但是它不会自动链接到 C++ 库中。

g++ 将自动包含 C++ 库;默认情况下,它还会编译带有扩展名的文件,这些扩展名表明它们是 C 源代码为 C++,而不是 C。

来自http://gcc.gnu.org/onlinedocs/gcc/Invoking-G_002b_002b.html#Invoking-G_002b_002b:

C++ 源文件通常使用以下后缀之一:.C.cc.cpp.CPP.c++.cp.cxx; C++头文件经常使用.hh.hpp.H,或者(对于共享模板代码).tcc;和预处理的 C++ 文件使用后缀 .ii。 GCC 识别具有这些名称的文件并将它们编译为 C++ 程序,即使您调用编译器的方式与编译 C 程序的方式相同(通常使用名称 gcc)。

但是,使用 gcc 并没有添加 C++ 库。 g++ 是一个调用 GCC 并将 .c.h.i 文件视为 C++ 源文件而不是 C 源文件的程序,除非使用 -x,并自动指定与 C++ 库的链接。该程序在预编译带有 .h 扩展名的 C 头文件以用于 C++ 编译时也很有用。

例如,要编译一个写入std::cout 流的简单 C++ 程序,我可以使用任一(Windows 上的 MinGW):

g++ -o test.exe test.cpp gcc -o test.exe test.cpp -lstdc++

但如果我尝试:

gcc -o test.exe test.cpp

我在链接时得到未定义的引用。

对于另一个区别,以下 C 程序:

#include <stdlib.h>
#include <stdio.h>

int main() 

    int* new;
    int* p = malloc(sizeof(int));

    *p = 42;
    new = p;

    printf("The answer: %d\n", *new);

    return 0;

编译并运行良好:

gcc -o test.exe test.c

但是使用编译时会出现几个错误:

g++ -o test.exe test.c

错误:

test.c: In function 'int main()':
test.c:6:10: error: expected unqualified-id before 'new'
test.c:6:10: error: expected initializer before 'new'
test.c:7:32: error: invalid conversion from 'void*' to 'int*'
test.c:10:9: error: expected type-specifier before '=' token
test.c:10:11: error: lvalue required as left operand of assignment
test.c:12:36: error: expected type-specifier before ')' token

【讨论】:

因为它使用“new”作为变量名,嗬嗬。 什么样的程序员使用“new”作为变量名?我更想知道的是,您是如何使用 gcc 成功编译该可憎的... @JohnJohn 这只是一个有效的 C(但无效的 C++)代码示例,这就是 gcc 编译它的原因。【参考方案2】:

据我所知,g++ 使用正确的 C++ 链接器选项,而 gcc 使用 C 链接器选项(因此您可能会得到未定义的引用等)。

【讨论】:

@gdb:有趣,我通常会遇到问题,不过我猜你可能通过手动传递正确的标志来修复它们。 可能。另外,g++和gcc-c++有什么区别? @gdb:我很困惑……这不是你最初的问题吗?

以上是关于gcc 和 g++/gcc-c++ 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

GCC -g vs -g3 GDB 标志:有啥区别?

G++和GCC和C,C++有啥区别的

“gcc -s”和“strip”命令有啥区别?

gcc和msvc(或Linux和Windows)中的valarray有啥区别

-m32、-m64 和 gcc 选项中的任何内容有啥区别?

-symbolic 和 -shared GCC 标志之间有啥区别?