为什么使用g ++而不是gcc编译* .cc文件?

我编译了一个使用g ++而不是gcc的库。 首先,我认为源代码是用C ++编写的,但后来我发现在* .cc文件中没有任何C ++代码。

为了证实这一点,我用gcc替换了原始makefile中的g ++。 我仍然得到了正确的方案。

任何人都可以解释这个 这不是我第一次遇到这种情况。


这取决于你在makefile中改变了什么。 gcc / g++实际上只是一个前端驱动程序,它根据您提供的选项调用实际的编译器和/或链接器。

如果您以gcc身份调用编译器:

  • 它将根据文件扩展名( .c.cc / .cpp )编译为C或C ++;
  • 它会链接为C,即它不会拉入C ++库,除非您专门添加了其他参数才能这样做。
  • 如果你以g++调用编译器:

  • 无论文件扩展名是.c还是.cc / .cpp ,它都将编译为C ++;
  • 它将链接为C ++,即自动引入标准C ++库。
  • (请参阅GCC文档的相关部分)。


    这是一个简单的程序,它可以检测它是否被编译为C或C ++。

    (它利用一个字符常数具有一个大小的事实int在C,或char在C ++。 sizeof(char)是1定义; sizeof(int)通常将更大-除非你正在使用难以理解的平台与> = 16位字节,你可能不是。)

    我称它为test.c并将其复制为test.cc

    $ cat test.c
    #include <stdio.h>
    
    int main(void)
    {
      printf("I was compiled as %s!n", sizeof('a') == 1 ? "C++" : "C");
      return 0;
    }
    $ cp test.c test.cc
    $
    

    gcc编译和链接test.c ,用g++编译test.cc ,按预期工作:

    $ gcc -o test test.c
    $ ./test
    I was compiled as C!
    $ g++ -o test test.cc
    $ ./test
    I was compiled as C++!
    $ 
    

    编译和链接test.ccgcc无效:它将代码编译为C ++,因为该文件以.cc结尾,但在链接阶段失败:

    $ gcc -o test test.cc
    /tmp/ccyb1he5.o:(.eh_frame+0x11): undefined reference to `__gxx_personality_v0'
    collect2: ld returned 1 exit status
    $ 
    

    我们可以通过单独编译gcc来证明,并使用g++进行链接(以引入正确的库):

    $ gcc -c test.cc
    $ g++ -o test test.o
    $ ./test
    I was compiled as C++!
    $
    

    ... gcc将代码编译为C ++而不是C,因为它有一个.cc文件扩展名。

    鉴于g++不会将.c文件编译为纯C:

    $ g++ -o test test.c 
    $ ./test
    I was compiled as C++!
    $ 
    

    可能是.cc代码恰好是C,但是打算将其链接到C ++库中。 内部是不同的。


    g++自动链接C ++运行时库 - gcc不会。 可以忽略的是,什么时候它并不重要 - 那么它并不重要,但正如已经指出的那样,它可以用于将来的使用。

    链接地址: http://www.djcxy.com/p/85759.html

    上一篇: why use g++ instead of gcc to compile *.cc files?

    下一篇: linker problem with libstdc++.so.6 in connection with cuda