Это зависит от того, что именно вы изменили в 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++!
$