【问题标题】:Compiling a C++ program with GCC使用 GCC 编译 C++ 程序
【发布时间】:2011-03-11 20:05:52
【问题描述】:

如何使用 GCC 编译器编译 C++ 程序?

文件 info.c

#include<iostream>
using std::cout;
using std::endl;

int main()
{
   #ifdef __cplusplus
   cout << "C++ compiler in use and version is " << __cplusplus << endl;
   #endif
   cout <<"Version is " << __STDC_VERSION__ << endl;
   cout << "Hi" << __FILE__ << __LINE__ << endl;
}

当我尝试编译 info.c:

gcc info.C

Undefined                       first referenced
 symbol                             in file
cout                                /var/tmp/ccPxLN2a.o
endl(ostream &)                     /var/tmp/ccPxLN2a.o
ostream::operator<<(ostream &(*)(ostream &))/var/tmp/ccPxLN2a.o
ostream::operator<<(int)            /var/tmp/ccPxLN2a.o
ostream::operator<<(long)           /var/tmp/ccPxLN2a.o
ostream::operator<<(char const *)   /var/tmp/ccPxLN2a.o
ld: fatal: Symbol referencing errors. No output written to a.out
collect2: ld returned 1 exit status

GCC 编译器不是可以编译 C++ 程序吗? 在相关说明中,gccg++ 之间有什么区别?

【问题讨论】:

标签: c++ gcc g++ gnu


【解决方案1】:

gcc 实际上可以很好地编译 C++ 代码。您收到的错误是链接器错误,而不是编译器错误。

如果您将编译行更改为:

gcc info.C -lstdc++

这使它链接到标准 C++ 库,然后它就可以正常工作了。

但是,您应该让您的生活更轻松并使用g++


Ruphis comment 中对另一个答案说得最好:

[...] gcc 将 选择正确的后端编译器 基于文件扩展名(即将 将 .c 编译为 C,将 .cc 编译为 C++) 并将二进制文件仅针对 标准 C 和 GCC 帮助程序库 默认不考虑输入语言; g++ 也会选择正确的 基于扩展的后端除了 我认为它编译了所有 C 源代码 作为 C++ 代替(即它同时编译 .c 和 .cc 作为 C++),它包括 libstdc++ 在其链接步骤中不管 输入语言。

【讨论】:

    【解决方案2】:

    如果你给代码一个 .c 扩展名,编译器会认为它是 C 代码,而不是 C++。而 C++ 编译器驱动叫做 g++,如果你使用 gcc 驱动你会遇到链接器问题,因为标准 C++ 库默认不会链接。所以你想要:

    g++ myprog.cpp
    

    甚至不要考虑使用大写的 .C 扩展名,除非您不想移植您的代码,并且准备被与您一起工作的人讨厌。

    【讨论】:

    • @Neil:据我所知,gcc 确实将 .C(大写)扩展视为 c++ 扩展。以下工作正常:gcc test.C -lstdc++ -o testg++ test.C -o test
    • @Evan 是的,当然可以。但这并不意味着您应该永远使用它,因为它会导致严重的可移植性问题,所有区分大小写的文件名也是如此。 C++ 文件的扩展名应始终为 .cpp。这不会导致任何问题,并且保证可以在所有常见的操作系统上运行。
    【解决方案3】:

    您应该使用g++ 而不是gcc

    【讨论】:

    • 你能解释一下原因吗?
    • 请也给出原因,答案不完整。我不知道这是标准答案吗?
    【解决方案4】:

    默认情况下,gcc 根据文件扩展名选择语言,但您可以使用 -x 选项强制gcc 选择不同的语言后端:

    gcc -x c++
    

    更多选项在gcc 手册页的“控制输出类型的选项”下进行了详细说明。参见例如gcc(1) - Linux man page(在页面上搜索文本-x language)。

    gcc 无法使用文件扩展名猜测语言的情况下,此工具非常有用,例如,如果您正在生成代码并通过standard input 将其提供给gcc

    【讨论】:

      【解决方案5】:

      gccg++的区别是:

           gcc            |        g++
      compiles C source   |   compiles C++ source
      

      使用g++ 而不是gcc 来编译你的C++ 源代码。

      【讨论】:

      • 比这里的其他答案要复杂一些。 gcc 将根据文件扩展名选择正确的后端编译器(即,将 .c 编译为 C,将 .cc 编译为 C++)并默认将二进制文件与标准 C 和 GCC 帮助程序库链接,而不管输入语言如何; g++ 还将根据扩展名选择正确的后端,除了我认为它将所有 C 源代码编译为 C++(即,它将 .c 和 .cc 都编译为 C++),并且无论输入语言如何,它都在其链接步骤中包含 libstdc++。
      • @Rup:正确,这基本上就是我在回答中所说的。
      【解决方案6】:

      如果我没记错的话,gcc 会根据后缀确定文件类型。因此,将其设为 foo.cc,它应该可以工作。

      而且,回答你的另一个问题,是“gcc”和“g++”之间的区别。 gcc 是一个选择正确编译器的前端。

      【讨论】:

        【解决方案7】:

        对我来说效果很好。在 Windows 命令行中只需一行代码 (CMD)。

        首先,确认您已经安装了gcc(用于C)或g++(用于C++)编译器。

        在命令行中,对于 gcc,键入:

        gcc --version
        

        在命令行中,对于 g++,键入:

        g++ --version
        

        如果已安装,则继续。

        现在,使用命令行编译您的 .c 或 .cpp。

        对于 C 语法:

        gcc -o exe_filename yourfilename.c
        

        例子:

        gcc -o myfile myfile.c
        

        这里的exe_filename (myfile in example)你的.exe文件的名字,你想在编译后生成(注意:我这里没有放任何扩展名) . yourfilename.c (myfile.c in example)your source file,扩展名为 .c。

        现在转到包含 .c 文件的文件夹。在这里,您将找到一个扩展名为 .exe 的文件。打开它。万岁……

        对于 C++ 语法:

        g++ -o exe_filename yourfilename.cpp
        

        之后,过程与 C 语法相同。

        【讨论】:

        • 问题是“如何使用 gcc 编译器编译 C++ 程序?”不是“如何使用 gcc 编译器编译 C 程序?或如何使用 g++ 编译器编译 C++ 程序?”
        • 不错的收获! @DevX
        【解决方案8】:

        对于 .cpp 文件:

        g++ myprog.cpp -o myprog
        

        【讨论】:

          【解决方案9】:

          我的 GCC 版本 10.3.0Ubuntu 上的更新。即使我添加-lstdc++ 或使用正确的扩展名,cc1plus 也必须安装在系统上。否则会出现此错误:

          gcc:致命错误:无法执行'cc1plus':execvp:没有这样的文件或目录

          一种方法是安装g++,即使您不打算直接使用它,例如sudo apt install g++.

          现在,如果我使用扩展名.cc,我可以直接调用gcc,但是仍然会出现警告和错误。要干净地使用gcc,并带有.c 扩展名,我必须将其称为like this

          gcc -x c++ info.c -lstdc++
          

          如果我使用 .cc 扩展名会更短,例如 accepted answer

          gcc info.cc -lstdc++
          

          或者像其他人说的那样,改用g++ info.c。不需要额外的参数来指示 C++,它适用于 .c.cc.cpp 扩展。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-07-07
            • 2011-11-05
            • 2013-01-18
            • 1970-01-01
            • 2020-06-28
            • 1970-01-01
            • 2014-11-18
            相关资源
            最近更新 更多