Mac OS X 上的动态链接,一个小例子
脚步:
- 创建一个包含 mymod.o 的库 libmylib.dylib
- 编译并链接一个调用它的“callmymod”
- 使用 DYLD_LIBRARY_PATH 和 DYLD_PRINT_LIBRARIES 从 callmymod 调用 mymod
问题:您“只是”想创建一个库供其他模块使用。然而,有一堆令人生畏的程序——gcc、ld、macosx libtool、dyld——有无数的选项、一些腐烂的堆肥,以及 MacOSX 和 Linux 之间的差异。有大量的手册页(我在 10.4.11 ppc 中计算了 7679 + 1358 + 228 + 226 行),但没有太多示例,或者具有“告诉我你在做什么”模式的程序。
(理解最重要的是给自己做一个简化的OVERVIEW:画一些图,跑一些小例子,给别人解释)。
背景:苹果 OverviewOfDynamicLibraries,
维基百科 Dynamic_library
第一步,创建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
第二步,编译链接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
,它是 mac 上的 glibtool,以及SCons。)