Динамическое связывание в Mac OS X, крошечный пример
Шаги:
- создать библиотеку libmylib.dylib, содержащую mymod.o
- скомпилировать и связать callmymod, который вызывает его
- вызовите mymod из callmymod, используя DYLD_LIBRARY_PATH и DYLD_PRINT_LIBRARIES
Проблема: вы просто хотите создать библиотеку для использования другими модулями. Однако есть устрашающая куча программ - gcc, ld, macosx libtool, dyld - с огромным количеством опций, немного испорченным компостом и различиями между MacOSX и Linux. Существует множество страниц руководства (я насчитал 7679 + 1358 + 228 + 226 строк в 10.4.11 ppc), но мало примеров или программ с режимом «скажите мне, что вы делаете».
(Самая важная вещь для понимания - это сделать для себя упрощенный ОБЗОР: нарисовать несколько картинок, запустить несколько небольших примеров, объяснить это кому-нибудь).
Справочная информация: Обзор яблочных библиотек , Википедия Dynamic_library
Шаг 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