Piszę plik wykonywalny, który używa dlopen() (LoadLibrary() w systemie Windows), aby dynamicznie ładować bibliotekę współużytkowaną. Biblioteka współdzielona używa symboli z pliku wykonywalnego.Mac: Jak wyeksportować symbole z pliku wykonywalnego?
W systemie Windows jest to możliwe. Pliki wykonywalne mogą eksportować symbole: działają pliki declspec (dllexport) i .def. Łącznik, podczas tworzenia .exe, również tworzy plik .lib ("bibliotekę importu"), więc biblioteka DLL musi po prostu połączyć się z tym .lib.
W systemie Linux jest to również możliwe. Przepuszczam -Wl, -export_dynamic podczas budowania pliku wykonywalnego, aby eksportował swoje symbole.
W systemie Mac OS X, zamiast ... -Wl, -export_dynamic nie działa, ale jest -Wl, -exported_symbols_list, <filename>
<filename>
gdzie znajduje się lista symboli do eksportu (rodzaj prostszej wersji plik .def). Ale budowanie wspólnej biblioteki nie jest tak proste: linker narzeka na nierozwiązane symbole.
Próbowałem włamać: zmieniono nazwę pliku wykonywalnego na lib <executable>
.dylib, a po połączeniu z biblioteką udostępnioną przejąłem -l <executable>
. Ale daje błąd "nie można połączyć z głównym plikiem wykonywalnym".
Ogólny problem polega na tym, że biblioteki współdzielone Linux mogą mieć nierozwiązane symbole, podczas gdy Windows i Mac OS X na to nie zezwalają. Ale system Windows ma "biblioteki importu", aby rozwiązać problemy z zależnościami, a Mac OS X najwyraźniej nie ...
Jak można to rozwiązać w systemie Mac OS X? Czy istnieje odpowiednik "biblioteki importu" (biblioteki pośredniczącej utworzonej przez linker systemu Windows podczas tworzenia pliku .dll, więc jeśli dowolny moduł musi dynamicznie łączyć się z .dll, jest powiązany z "biblioteką importu")? Lub jakieś inne rozwiązanie?
BTW, "env MACOSX_DEPLOYMENT_TARGET = 10.3" nie jest potrzebne dla wersji 10.5 i wyższej. – lhf