C-Bibliothek lässt sich nicht mit gcc/g++ verknüpfen

Lesezeit: 2 Minuten

Ich habe eine C-Bibliothek, die ich in gcc verwende. Die Bibliothek hat die Erweiterung .lib, wird aber immer als statische Bibliothek gelinkt. Wenn ich ein Programm schreibe, das die Bibliothek als C-Code verwendet, ist alles in Ordnung. Wenn ich die Datei jedoch in .cpp umbenennen (einfache Sachen machen, die sowohl in c/c++ funktionieren), erhalte ich eine undefinierte Referenz. Dies sind einfache kleine Programme, die ich zu Testzwecken schreibe, also keine ausgefallenen Sachen. Ich kompiliere mit:

gcc -g -Wall -I <path to custom headers> -o program main.c customlibrary.lib -lm -lpthread

Das obige funktioniert wie ein Zauber. Jedoch:

g++ -g -Wall -I <path to custom headers> -o program main.cpp customlibrary.lib -lm -lpthread

oder

gcc -g -Wall -I <path to custom headers> -o program main.cpp customlibrary.lib -lm -lpthread -lstdc++

führt zu einem undefinierten Verweis auf eine beliebige Funktion in der customlibrary.lib. Ich habe versucht, einen symbolischen Link namens customlibrary.a zu erstellen, aber kein Glück.

Warum erkennt g++ find meine Bibliothek nicht. Leider habe ich keinen Zugriff auf den Quellcode der Bibliotheken, aber das Verknüpfen einer C-Lib mit C++ sollte kein Problem sein, oder?

Ihre Bibliothek scheint über eine API zu verfügen, die davon ausgeht, dass sie von C und nicht von C++ aufgerufen wird. Dies ist wichtig, da C++ effektiv erfordert, dass die aus einer Bibliothek exportierten Symbole mehr Informationen enthalten als nur den Funktionsnamen. Dies wird durch “Name Mangling” der Funktionen gehandhabt.

Ich nehme an, Ihre Bibliothek hat eine Include-Datei, die ihre öffentliche Schnittstelle deklariert. Um es sowohl mit C als auch mit C++ kompatibel zu machen, sollten Sie einem C++-Compiler mitteilen, dass die von ihm deklarierten Funktionen davon ausgehen sollten, dass sie die Verknüpfung und Benennung von C verwenden.

Eine wahrscheinlich einfache Antwort, um dies zu testen, ist dies:

extern "C" {
#include "customlibrary.h"
}

in Ihrer main.cpp statt nur einzufügen customlibrary.h direkt.

Damit der Header selbst in beiden Sprachen funktioniert und seine Funktionen korrekt als C-ähnlich zu C++ deklariert werden, fügen Sie Folgendes am Anfang der Header-Datei ein:

#ifdef __cplusplus
extern "C" {
#endif

und folgendes ganz unten:

#ifdef __cplusplus
}
#endif

  • Das Symbol __cplusplus hat zwei Unterstriche, wie in den einschlägigen Normen definiert.

    – RBerteig

    3. April 2012 um 19:08 Uhr

Der C++-Compiler führt ein sogenanntes Namensmangling durch – die Namen, die in Ihrem Code erscheinen, sind nicht dieselben, die Ihr Linker sieht. Der normale Weg, dies zu umgehen, besteht darin, dem Compiler mitzuteilen, dass bestimmte Funktionen eine C-Verknüpfung benötigen:

// myfile.cpp
extern "C" int libfun();    // C function in your library

oder tun Sie es für eine ganze Header-Datei:

// myfile.cpp
extern "C" {
  #include "mylibdefs.h"      // defs for your C library functions
}

Hat Ihre Header-Datei die übliche

#ifdef __cplusplus
extern "C" {
#endif

// ...

#ifdef __cplusplus
} /* extern "C" */
#endif

um den Bibliotheksfunktionen C-Linkage explizit zu geben.

.cpp-Dateien werden standardmäßig mit C++-Verknüpfung kompiliert, dh Namensverstümmelung.

1326120cookie-checkC-Bibliothek lässt sich nicht mit gcc/g++ verknüpfen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy