2016-04-27 11 views
0

Ich habe eine interessante für mich Weg zum Export von Funktionen aus Dll (Windows) mit Modul-Definition (.def) -Datei und freundliche Namen für den Export gefunden, aber ich kann keine Informationen finden auf wie das auf Mac gemacht werden kann..def Datei entspricht OS X

Ich würde gerne wissen, ob es irgendein Äquivalent Moduldefinition auf OS X ist

+0

Sie meinen [wie diese Frage] (http://stackoverflow.com/questions/4506121/how-to-print-a-list-of-symbols-exported-from-a-dynamic-library)? – tadman

Antwort

1

Der Hauptteil von dem, was Sie suchen (wenn ich es verstanden habe) kann die -alias <symbol_name> <alternate_symbol_name> erreicht werden unter Verwendung von und -alias_list <filename> Optionen zum Linker (ld). Mit -exported_symbol <symbol> und und deren Dateilisten-Gegenstücken -exported_symbols_list <filename> und -unexported_symbols_list <file> können Sie zusätzliche Kontrolle erreichen.

1

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.

+0

Vielen Dank für eine detaillierte Antwort, ich werde definitiv einige meiner Ansätze überdenken müssen. Ich markiere Ken Thomases Antwort als akzeptiert für Tracking-Zwecke, da es direkt die Frage beantwortet, aber Ihr war unglaublich hilfreich und ließ mich über Dinge nachdenken, die ich mache. – user3081123