В настоящее время я прочитал статью о имя mangling на wikipeida (link). В этой статье я узнаю, что общая идиома extern "C"
используется для защищает эти C-коды в исходном файле C++ от искажений, что делает эти исходные коды несовместимыми для привязки к исходному C lib.Почему моя моя программа на C++ корректно связана при замене libstdC++ с помощью libgcc
Так что я сделать следующее рассуждение:
Если я пишу такой код:
#include<stdio.h>
int main()
{
printf("Hello World\n");
return 0;
}
и компилировать это с командой g++ test.cpp -o test
, то он будет успешно скомпилировать без сомнения. Нам не нужно прилагать printf()
с extern "C"
, хотя printf()
является функцией C. Это потому, что, есть еще printf()
в libstdc++
, который отличается от libgcc
.
До сих пор так хорошо.
Но я обнаружил, что это не так верно, как я думаю.
Я выполнить несколько экспериментов:
Я удалить все libstdc++
под /USR/Lib, которые включают в себя
- /usr/lib/gcc/x86_64-linux-gnu/4.8/ libstdC++.
- /usr/lib/gcc/x86_64-linux-gnu/4.8/libstdc++.so
- /usr/lib/x86_64-linux-gnu/libstdc++.so.6
- /USR/Lib/x86_64-ли Nux-гну/libstdC++. so.6.0.19
, а затем я сделать копию libgcc
и поместить его под местом, где libstdc++
жил (в противном случае компоновщик жалобы о libstdC++ не найден)
$ Судо ф ./gcc/x86_64-linux-gnu/4.8/libgcc.a ./gcc/x86_64-linux-gnu/4.8/libstdc++.a
Однако приведенный выше код компиляции, безextern "C"
!!!
Почему? не должен ли он выкидывать Неразрешенный справочник или что-то подобное, потому что printf()
, которые были искажены компилятором C++, несовместимы с printf()
в li libgcc
?
любой скажите мне, почему мой вопрос сведется вниз?
Как 'ехЬегп "C"' "известный"? –
@ Daniel Kamil Kozar Я действительно не знаю, но на этой вики-странице он назывался «common C++ idiom» – walkerlala
Возможно, он пытается связать с общей библиотекой '/ usr/lib/x86_64-linux-gnu/libstdC++ .so.6.0.19'. Вам нужно добавить флаг для связывания статически. PS вам не нужно было перемещать этот lib, есть опция компилятора, которая удаляла библиотеки по умолчанию из команды link. –