Ich baue eine Windows dynamische Bibliothek mit der MinGW Toolchain.Wie kann ich dem MinGW-Linker mitteilen, dass er nicht alle Symbole exportieren soll?
Um diese Bibliothek zu erstellen, bin ich statisch mit anderen 2 verbunden, die eine API anbieten, und ich habe eine .def
Datei, wo ich das einzige Symbol geschrieben habe, das ich in meine Bibliothek exportieren möchte.
Das Problem ist, dass GCC alle Symbole einschließlich der aus den Bibliotheken exportiert, die ich verlinke. Gibt es sowieso, dem Linker zu sagen, nur die Symbole in der def
Datei zu exportieren?
Ich weiß, es gibt die Option --export-all-symbols
, aber es scheint nicht das Gegenteil zu sein.
Im Augenblick ist die letzte Zeile des Build-Skript hat diese Struktur:
g++ -shared CXXFLAGS DEFINES INCLUDES -o library.dll library.cpp DEF_FILE \
OBJECT_FILES LIBS -Wl,--enable-stdcall-fixup
EDIT: Im docs über den Linker heißt es, dass --export-all-symbols
das Standardverhalten ist, und dass es deaktiviert, wenn Sie nicht verwenden diese Option explizit, wenn Sie eine def
Datei bereitstellen, außer wenn dies nicht der Fall ist; Die Symbole in 3rd-Party-Bibliotheken werden trotzdem exportiert.
EDIT: Das Hinzufügen der Option --exclude-libs LIBS
oder –exclude-symbols SYMBOLS
verhindert nicht, dass die Symbole aus den Bibliotheken exportiert werden.
Vielen Dank für Ihre Antwort! Es funktioniert, wenn die Symbole nicht in der 'def'-Datei angegeben sind, werden sie nicht exportiert, auch die aus den Bibliotheken. Ich werde dllwrap verwenden, ich bin binutils 2.20 und dllwrap ist immer noch da, vielleicht ist es immer noch gepflegt. Wenn es veraltet ist ... sollte es nicht einen Weg geben, dasselbe mit gcc und cia zu machen? –
@James Der bevorzugte Weg besteht darin, die Symbole in der Quelle mit 'dllexport/dllimport' zu markieren und die Symbolsichtbarkeit so zu behandeln. – rubenvb