Verwenden Sie eine .def-Datei, um einfachere Namenskonventionen für exportierte Symbole zu erzwingen wirklich nicht der Weg zu gehen - in der Regel, wenn Sie Probleme auf dieser Ebene haben, gibt es eine gute Chance, dass etwas anderes schief gehen wird. Ich basiere dies auf dem C++
Tag in Ihrer Frage. Der Compiler/Linker erzeugt im Allgemeinen den korrekten Mangling, um dem Code zu entsprechen, den Sie exportieren, wenn Sie den Code C++
verbinden möchten. Wenn Sie versuchen, ihn zu konsumieren, würden Linker-Fehler anzeigen, dass Sie die Binärkompatibilität umgehen und Verknüpfung kann das geringste Ihrer Probleme sein - Sie alle streunen in potentiell inkompatible Allokatoren, etc.
Sie sollten eine einfache "C" API exportieren, die Linking-Komplikationen reduzieren wird - es gibt eine gut definierte C-Verknüpfung und die Routinen erhalten einfache Namen zum Verknüpfen.
Dies ist der allgemeine Zweck der Wachen in .h-Dateien:
#ifdef __cplusplus
extern "C" {
#endif
… library exports …
#ifdef __cplusplus
}
#endif
Dadurch werden Sie automatisch eminent einfachere Namen bekommen für die Anbindung an als die Faltungen Sie normalerweise sehen würde, wenn der Code zu verknüpfen gegen C++ versucht - Solange Sie #include
die .h
Datei beim Kompilieren der Datei .cpp
, solange es Deklarationen für die Routinen, die Sie in .h
exportieren möchten, die die entsprechenden Definitionen in der .cpp
haben, werden sie automatisch exportiert werden exportiert.
Sie können immer noch die Antworten von Ken Thomases Antwort verwenden - sie geben Ihnen Symbole Sichtbarkeit und Symbol-Aliasing, aber TBH, es klingt wie Sie versuchen, eine Lösung, die Sie in Windows verwendet haben, auf eine andere Plattform passen , aber für mich scheint es, als ob Sie in erster Linie einen falschen Ansatz in der Windows-Plattform verwendet haben.
Historisch/Verknüpfung Kommentar:
Ich werde auch erwähnen, dass die .def
Datei-Unterstützung auf Windows wirklich durch den verschiedenen Export-Mechanismus an den Fenstern verursacht wird - es ursprünglich exportierten Symbole aus .dll
Dateien durch die Ordnungs - also eine Zahl, also musste man die def-Datei verwenden, um die Verknüpfung von Namen wieder mit der betreffenden Nummer zu verknüpfen, um Dinge wie die Aufrufkonventionen zu verstehen. Die meisten Unix/Linux-Systeme haben niemals nur nummerierte Indizes exportiert, was bedeutet, dass die Namen, die in der API definiert wurden, direkt verknüpft werden können.
Die etwas mangelhaften @<number>
Elemente am Ende von Funktionsnamen, die aus Windows .dll
Dateien exportiert wurden, zeigen heutzutage die Anzahl der Bytes an, die für Parameter benötigt werden.Die Aufrufkonvention __stdcall
fügt diese hinzu, um sicherzustellen, dass der Aufrufer versteht, dass die aufgerufene Funktion die Anzahl der Bytes vor der Rückgabe aus dem Stapel auflöst, sodass der Aufrufer alle möglichen zusätzlichen Parameter für den Funktionsaufruf bereinigen kann (nur dies) theoretisch - Variadische Routinen werden vom Compiler automatisch in die cdecl-Aufrufkonvention konvertiert, um dieses Problem standardmäßig zu beseitigen.
Die ABIs auf anderen Plattformen verwenden keine Aufrufkonvention, die die Verantwortung für die Stapelbereinigung zwischen dem Aufrufer und dem Aufgerufenen aufteilen kann, so dass diese nicht standardmäßig als "Schutz" behandelt werden.
Sie meinen [wie diese Frage] (http://stackoverflow.com/questions/4506121/how-to-print-a-list-of-symbols-exported-from-a-dynamic-library)? – tadman