Sto scrivendo un eseguibile che utilizza dlopen() (LoadLibrary() su Windows) per caricare dinamicamente una libreria condivisa. La libreria condivisa utilizza i simboli dell'eseguibile.Mac: come esportare i simboli da un file eseguibile?
In Windows questo è possibile. I file eseguibili possono esportare simboli: i file declspec (dllexport) e .def funzionano entrambi. Il linker, quando crea l'exe, crea anche il file .lib (la "libreria di importazione"), quindi la DLL deve solo collegarsi a quel .lib.
In Linux, questo è anche possibile. Passo -Wl, -export_dynamic quando costruisci l'eseguibile in modo che esporti i suoi simboli.
In Mac OS X, invece ... -Wl, -export_dynamic non funziona, ma c'è -Wl, -exported_symbols_list, <filename>
dove <filename>
è un elenco di simboli per esportare (una sorta di una versione più semplice di un .def file). Ma poi, costruire la libreria condivisa non è così facile: il linker si lamenta dei simboli irrisolti.
Ho provato un hack: rinominato l'eseguibile in lib <executable>
.dylib e, quando collegavo la libreria condivisa, ho passato -l <executable>
. Ma dà l'errore "non può collegarsi con un eseguibile principale".
Il problema generale è che le librerie condivise Linux possono avere simboli non risolti, mentre Windows e Mac OS X non lo consentono. Ma Windows ha "librerie di importazione" per risolvere i simboli contro le dipendenze, e Mac OS X apparentemente non ...
Come può essere risolto su Mac OS X? Esiste un equivalente di una "libreria di importazione" (la libreria stub creata dal linker di Windows durante la creazione di un file .dll, quindi, se qualsiasi modulo deve collegarsi dinamicamente al file .dll, è collegato alla "libreria di importazione")? O qualche altra soluzione?
BTW, "env MACOSX_DEPLOYMENT_TARGET = 10.3" non è necessario per 10.5 e versioni successive. – lhf