habe ich in einem C++ Programm, die
dlfcn
Bibliothek zum dynamischen verwendet wird Verknüpfung mit einer gemeinsamen Objekt-Bibliothek durch den Benutzer des C gewählt ++ Programms während der Laufzeit, und für Funktionen in der gewählten gemeinsamen Objekt-Bibliothek überdlsym()
Aufruf und andere Funktionen indlfcn
.Warum wird extern "C" mit gemeinsamer Objektbibliothek zur Laufzeit verwendet?Angenommen, der Benutzer eine Objektbibliothek
x.so
während der Laufzeit aufgerufen geteilt wählt.x.so
wurde aus einer cpp-Datei mit den Definitionen der Funktionen inextern "C"
kompiliert. Ein Kommentar in der cpp-Datei sagt, dass die Verwendung vonextern "C"
ist wichtig, aber ohne weitere Erklärung, und ich frage mich warum?Ist es richtig, dass hier nur C++ - Code und kein C-Code beteiligt ist? So ist
extern "C"
nicht unbedingt nur verwendet, wenn C und C++ zusammen Code mischen?Ob die
dlfcn
Bibliothek statisch oder dynamisch mit dem C++ - Programm verknüpft ist, ist für die obigen Fragen wichtig?
- nun zu einem einfacheren Fall zu vergleichen, wo die gemeinsame Objekt-Bibliothek viel früher als Laufzeit bekannt ist, und der Autor der C++ Programm gibt es in dem C++ Programm ohne
dlfcn
zu verwenden, bevor es kompilierst, und dann verknüpft die gemeinsam genutzte Objektbibliothek und das C++ - Programm während der Laufzeit dynamisch. Ist in diesem Fall in der cpp Datei, die in die Shared Object Library kompiliert wurde, `extern 'C noch notwendig?
Danke.
Es ist irgendwie impliziert. Posix ist eine C-Spezifikation, daher erwartet jeder Verweis auf Funktionszeiger in Posix-APIs, dass diese Zeiger auf Funktionen mit C-Sprache-Verknüpfung sind. Aber der Begriff "C-Sprache-Verknüpfung" ist ein C++ - Begriff; Aus Sicht von C gibt es keine anderen Arten von Funktionen. Das Ergebnis ist, dass Sie bei Verwendung einer C-API aus C++ nur Funktionen mit C-Verknüpfung verwenden können. –
Um es einfach zu sagen, wenn Sie 'int foo (int ** x, struct Bar * & y)' in Ihrer gemeinsam genutzten Bibliothek haben, können Sie 'external" C "' dlsym (libhandle, "foo") '' verwenden anstelle von 'dlsym (libhandle, _Z3fooPPiRP3Bar") "oder was auch immer Mangeln von' foo' passiert diese Woche auf deiner Plattform. Kein tatsächlicher C-Code muss involviert sein. –