Как да създам динамична библиотека (dylib) с Xcode?

Създавам няколко помощни програми от командния ред в Xcode (обикновен C, без какао). Искам всички те да използват моята персонализирана версия на libpng и искам да спестя място, като споделям едно копие на библиотеката сред всички изпълними файлове (нямам нищо против да разпространявам отново .dylib с тях).

Трябва ли да направя някаква магия, за да получа символи за експортиране на libpng?

„Свързване на двоични файлове с библиотеки“ създава ли статично фазова връзка?

В документите на Apple се споменава зареждане на библиотеки по време на изпълнение с dlopen, но как мога да накарам Xcode да създава изпълним файл, без да се оплаквам от липсващи символи?


Мисля, че разбрах:

  • libpng не се свързваше правилно, защото създадох 32/64-битови изпълними файлове и 32-битова библиотека. Настройките за компилация на библиотеката и изпълнимите файлове трябва да съвпадат.

  • config.h на libpng трябва да има много дефиниции като #define FEATURE_XXX_SUPPORTED

  • Фазата на изграждане на „Свързване на двоични файлове с библиотеки“ се справя добре с динамичните библиотеки и DYLD_FALLBACK_LIBRARY_PATH променливата на околната среда е необходима за зареждане на .dylibs от пакета приложения.


person Kornel    schedule 11.10.2008    source източник
comment
Бих искал да предложа етикета mach-o, но не предполагам, че си струва да премахвате някой от съществуващите етикети в негова полза.   -  person ephemient    schedule 12.10.2008


Отговори (4)


Вероятно трябва да се уверите, че динамичната библиотека, която създавате, има файл с експортирани символи, който изброява какво трябва да бъде експортирано от библиотеката. Това е просто плосък списък от символи, по един на ред, за експортиране.

Освен това, когато вашата динамична библиотека е изградена, тя получава име за инсталиране, вградено в нея, което по подразбиране е пътя, по който е изградена. Впоследствие всичко, което се свързва с него, първо ще го търси по посочения път и едва след това ще търси (малък) набор от пътища по подразбиране, описани под DYLD_FALLBACK_LIBRARY_PATH в dyld(1) страница с ръководство.

Ако възнамерявате да поставите тази библиотека до вашите изпълними файлове, трябва да коригирате нейното име за инсталиране, за да се позовава на това. Самото търсене в Google за „име на инсталиране“ би трябвало да покаже много информация за това.

person Chris Hanson    schedule 12.10.2008
comment
Ами ако имам проста чиста C функция и искам да я изложа като динамична библиотека. Как мога да направя това (направих го лесно с Visual Studio на Windows)? - person Royi; 23.02.2017

Динамично свързване на Mac OS X, малък пример

стъпки:

  1. създайте библиотека libmylib.dylib, съдържаща mymod.o
  2. компилирайте и свържете callmymod, който го извиква
  3. извикайте mymod от callmymod, използвайки DYLD_LIBRARY_PATH и DYLD_PRINT_LIBRARIES

Проблем: просто искате да създадете библиотека за използване от други модули. Въпреки това има плашеща купчина програми -- gcc, ld, macosx libtool, dyld -- с милиони опции, някои добре изгнили компостни продукти и разлики между MacOSX и Linux. Има много страници с ръководство (преброявам 7679 + 1358 + 228 + 226 реда в 10.4.11 ppc), но не много като примери или програми с режим Кажи ми какво правиш.

(Най-важното нещо за разбирането е да направите опростен ПРЕГЛЕД за себе си: нарисувайте няколко снимки, пуснете някои малки примери, обяснете на някой друг).

Предистория: apple OverviewOfDynamicLibraries , Динамична_библиотека на Уикипедия


Стъпка 1, създайте libmylib.dylib --

mymod.c:
    #include <stdio.h>
    void mymod( int x )
    {
        printf( "mymod: %d\n", x );
    }
gcc -c mymod.c  # -> mymod.o
gcc -dynamiclib -current_version 1.0  mymod.o  -o libmylib.dylib
    # calls libtool with many options -- see man libtool
    # -compatibility_version is used by dyld, see also cmpdylib

file libmylib.dylib  # Mach-O dynamically linked shared library ppc
otool -L libmylib.dylib  # versions, refs /usr/lib/libgcc_s.1.dylib

Стъпка 2, компилирайте и свържете callmymod --

callmymod.c:
    extern void mymod( int x );
    int main( int argc, char** argv )
    {
        mymod( 42 );
    }
gcc -c callmymod.c
gcc -v callmymod.o ./libmylib.dylib -o callmymod
    # == gcc callmymod.o -dynamic -L. -lmylib
otool -L callmymod  # refs libmylib.dylib
nm -gpv callmymod  # U undef _mymod: just a reference, not mymod itself

Стъпка 3, стартирайте callmymod, свързвайки libmylib.dylib --

export DYLD_PRINT_LIBRARIES=1  # see what dyld does, for ALL programs
./callmymod
    dyld: loaded: libmylib.dylib ...
    mymod: 42

mv libmylib.dylib /tmp
export DYLD_LIBRARY_PATH=/tmp  # dir:dir:...
./callmymod
    dyld: loaded: /tmp/libmylib.dylib ...
    mymod: 42

unset DYLD_PRINT_LIBRARIES
unset DYLD_LIBRARY_PATH

Това завършва един малък пример; надявам се, че помага за разбирането на стъпките.
(Ако правите това често, вижте GNU Libtool, което е glibtool на mac, и SCons.)

person denis    schedule 05.02.2009
comment
хубаво. какво ще стане, ако вече имате .o файловете, но има да речем 9 от тях в 3-те папки, но всички са част от една и съща рамка... това призив за lipo ли е или какво? между другото се опитвам да накарам libg7221 да бъде споделена библиотека, в този случай... - person Alex Gray; 08.09.2011
comment
@alex grey, не знам, съжалявам; задайте това като нов въпрос? - person denis; 08.09.2011

За съжаление според моя опит документацията на Apple е остаряла, излишна и липсва МНОГО често срещана информация, от която обикновено се нуждаете.

Написах куп неща за това на моя уебсайт, където трябваше да накарам FMOD (Sound API), за да работи с моята кросплатформена игра, която разработихме в университета. Това е странен процес и съм изненадан, че Apple не добавят повече информация към своите документи за разработчици.

За съжаление, колкото и „зли“ да са Microsoft, те всъщност вършат много по-добра работа, като се грижат за своите разработчици с документация (това идва от евангелист на Apple).

Мисля, че основно това, което не правите, е СЛЕД като сте компилирали своя .app Bundle. След това трябва да изпълните команда на изпълнимия двоичен файл /MyApp.app/contents/MacOS/MyApp, за да промените къде изпълнимият файл търси своя библиотечен файл. Трябва да създадете нова фаза на изграждане, която може да изпълнява скрипт. Няма да обяснявам този процес отново, вече го направих в дълбочина тук:

http://brockwoolf.com/blog/how-to-use-dynamic-libraries-in-xcode-31-using-fmod

Надявам се това да помогне.

person Brock Woolf    schedule 23.11.2008
comment
@wintermute: Излишен коментар. Сигурен съм, че всеки потребител на този сайт е чувал милиони пъти преди. - person Brock Woolf; 04.08.2010
comment

Знаете ли за справочната страница на Apple Теми за програмиране на динамична библиотека? Трябва да покрива повечето от това, от което се нуждаете. Имайте предвид, че има споделени библиотеки, които се зареждат безусловно при стартиране на програмата, и динамично заредени библиотеки (пакети, IIRC), които се зареждат при поискване, и двете са малко по-различни в MacOS X от еквивалентите в Linux или Solaris.

person Jonathan Leffler    schedule 12.10.2008