зачем использовать g ++ вместо gcc для компиляции * .cc файлов? - PullRequest
6 голосов
/ 08 июля 2011

Я скомпилировал библиотеку, в которой вместо gcc используется g ++.Сначала я подумал, что исходный код написан на C ++, но позже узнал, что в файлах * .cc нет кода C ++.

Чтобы подтвердить это, я заменил g ++ в исходном make-файле на gcc.И я все еще получил правильную программу.

Кто-нибудь может это объяснить?Это была не первая встреча с такой ситуацией.

Ответы [ 4 ]

18 голосов
/ 09 июля 2011

Это зависит от того, что именно вы изменили в make-файле. gcc / g++ - это на самом деле просто программа драйвера внешнего интерфейса, которая вызывает фактический компилятор и / или компоновщик на основе заданных вами параметров.

Если вы вызываете компилятор как gcc:

  • будет скомпилировать как C или C ++ на основе расширения файла (.c или .cc / .cpp);
  • он будет связывать как C, то есть он не будет извлекать библиотеки C ++, если вы специально не добавите для этого дополнительные аргументы.

Если вы вызываете компилятор как g++:

  • он будет компилировать как C ++ независимо от того, является ли расширение файла .c или .cc / .cpp;
  • будет связывать как 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
$

Компиляция и связывание test.c с gcc и test.cc с g++, работает как ожидалось:

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

Компиляция и связывание test.cc с gcc не работает: он компилирует код как 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++!
$ 
2 голосов
/ 08 июля 2011

Может случиться так, что код .cc окажется как C, но должен был быть связан с библиотекой C ++. Внутренние органы разные.

1 голос
/ 08 июля 2011

g++ автоматически связывает библиотеку времени выполнения C ++ - gcc нет.Конечно, когда это не имеет значения - тогда это не имеет значения, но, как уже указывало spraff, это может быть предназначено для будущего использования.

0 голосов
/ 08 июля 2011

Я не знаю, почему они решили использовать g ++ вместо gcc, но я полагаю, что это не должно иметь значения, так как любая действительная программа на C также является допустимой C ++.

...