Почему IDE требует С++ компилятор для С кода?

Рейтинг: 3Ответов: 2Опубликовано: 17.03.2011

Code::Blocks 8.02
Ubuntu 10.04 LTS (x86_64)

Пишу Сишный код. Компилятор ругается, что нет g++, и просит установить. Установил. Заработало. Теперь вопрос, в чем отличие скомпилированного кода Си в gcc от кода Си в g++?

Ответы

▲ 5Принят

Почему IDE требует С++ компилятор для С кода?

Все очень просто. В качестве линкера (компоновщика связей) используется g++:

gcc -Wall -O2 -c /home/gaal/TEST/TEST/main.c -o obj/Release/main.o
g++ -o bin/Release/TEST obj/Release/main.o -s

Теперь вопрос, в чем отличие скомпилированного кода Си в gcc от кода Си в g++?

См. комментарии к предыдущему ответу. Если компилятор — gcc, а линкер — g++, то просто будут добавлены зависимости от библиотек C++. Если компилятор и линкер — g++ с ключами для C-кода, то опять же будут определенные библиотеки. Но по идее код будет «Сишным».

▲ 3

В бинарник будет зашит рантайм C++, возможно, добавятся какие-нибудь дополнительные секции.

Будут другие библиотечные зависимости:

C:

linux-vdso.so.1 =>  (0x00007fff6ab46000)
libc.so.6 => /lib/libc.so.6 (0x00007f0eb1149000)
/lib64/ld-linux-x86-64.so.2 (0x00007f0eb14f4000)

C++:

linux-vdso.so.1 =>  (0x00007fff12fff000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007fe1cab00000)
libm.so.6 => /lib/libm.so.6 (0x00007fe1ca87d000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007fe1ca666000)
libc.so.6 => /lib/libc.so.6 (0x00007fe1ca2e3000)
/lib64/ld-linux-x86-64.so.2 (0x00007fe1cae2e000)

Вот такой код:

int main(){}

скомпилированный (gcc, g++) и дизассемблированный отличался только строками:

// в начале main
.cfi_personality 0x3,__gxx_personality_v0
...
// при выходе из main
movl    $0, %eax

В варианте C++ обе были добавлены. Первая строка - видимо, какие-то метаданные, а вот вторую объяснить не могу, но в общем ничего существенного. Зачем-то обнуляется регистр eax.