Sto costruendo una libreria dinamica di Windows utilizzando la toolchain MinGW.Come dire al linker MinGW di non esportare tutti i simboli?
Per creare questa libreria sto collegando staticamente ad altri 2 che offrono un'API e ho un file .def
in cui ho scritto l'unico simbolo che voglio esportare nella mia libreria.
Il problema è che GCC sta esportando tutti i simboli, compresi quelli delle librerie a cui sto collegando. C'è comunque da dire al linker solo per esportare i simboli nel file def
?
So che c'è l'opzione --export-all-symbols
ma non sembra esserci il contrario.
In questo momento l'ultima riga dello script di build ha questa struttura:
g++ -shared CXXFLAGS DEFINES INCLUDES -o library.dll library.cpp DEF_FILE \
OBJECT_FILES LIBS -Wl,--enable-stdcall-fixup
EDIT: Nel docs circa il linker si dice che --export-all-symbols
è il comportamento predefinito e che è disattivata quando non si utilizza questa opzione esplicitamente se si fornisce un file def
, tranne quando non lo fa; i simboli nelle librerie di terze parti vengono comunque esportati.
MODIFICA: l'aggiunta dell'opzione --exclude-libs LIBS
o –exclude-symbols SYMBOLS
non impedisce l'esportazione dei simboli dalle librerie.
Grazie per la risposta! Funziona, a meno che i simboli non siano specificati nel file 'def' che non vengono esportati, anche quelli delle librerie. Userò dllwrap, sto usando binutils 2.20 e dllwrap è ancora lì, quindi forse è ancora mantenuto. Se è deprecato ... non dovrebbe esserci un modo per fare la stessa cosa usando solo gcc e cia? –
@James il modo preferito è contrassegnare i simboli nel sorgente con 'dllexport/dllimport' e avere la visibilità dei simboli gestita in questo modo. – rubenvb