Delphi.cz

Český portál Delphi

Dynamické zavádění knihoven v MAC OSX

Kreténi. Tak jedině mohu nazvat autory OS X. Vysvětlím proč. Minule jsem popisoval jak staticky linkovat knihovny na OSX. V podstatě si musíte dát jen pozor, aby se při importu u symbolů přidalo podtržítko. Tj. pokud se exportovaná funkce jmenuje Foo, při importu musíte specifikovat název

_Foo

Ok, prostě taková úchylka, člověk se s tím smíří.

Nyní jsem potřeboval dynamicky zavádět knihovnu. OK, no problem - Delphi v SysUtils dává možnost použít knihovní funkce podobné jako jsou na Windows, tj.

LoadLibrary
GetProcAddress
FreeLibrary

které interně šikovně volají POSIX funkce dlopen, dlsym atd. Je to pěkné a v pohodě. Mimochodem, pokud to potřebujete pro Windows, tak navštivte povídání o LoadLibrary a GetProcAddress co jsem napsal dříve (funkce jsou v jednotce Windows).

Ale zpět. Takže statické linkování je s podtržítkem a funguje OK. Když jsem chtěl zkusit dynamické zavádění, tak se knihovna sice zavedla korektně, ale nefungovalo získání adresy. Přitom při použití nástroje nm, který je součástí instalace xcode (ale i normálního linuxu), to vypisovalo, že požadovaný symbol včetně podtržítka je dostupný.

Nezafungovalo ani přidání dalšího podtržítka, až jsem si pořádně přečetl man stránku pro dlsym a tam je nakonec uvedena malá noticka - že se předává jméno bez podtržítka. A pak to fungovalo. Takže pro statické linkování s a dynamicky bez.

Následně jsem narazil na popis stejného problému ohledně dlsym na OS X od Eli Bolinga (který, pokud to nevíte, je jeden z autorů Kylixu a OS X kompilátoru), který se tomu slušně řečeno podivoval. Určitě si to přečtěte - na linuxu se to chová trošku jinak - prostě chaos.

Jinak jsem byl překvapen, jak pěkně funguje uvedená podpora v RTL Delphi.

Datum: 2012-11-07 00:17:00 Tagy: OSX, DLL, RTL

Praxe