在Mac OS X上进行动态链接,一个简单的示例
步骤:
- 创建一个包含mymod.o的库libmylib.dylib
- 编译并链接一个调用它的“callmymod”
- 使用DYLD_LIBRARY_PATH和DYLD_PRINT_LIBRARIES从callmymod中调用mymod
问题:你“只是”想创建一个供其他模块使用的库。
然而有一大堆程序 - gcc、ld、MacOSX libtool、dyld -
有无数个选项,有些已经腐烂了,而且MacOSX和Linux之间也存在差异。
有大量的man页(我在10.4.11 ppc中数了7679+1358+228+226行),
但是没有太多的示例或者可以让你“告诉我你在做什么”的程序。
(理解最重要的事情是为自己制作一个简化的概述:
画些图,运行一些小的示例,向别人解释)。
背景:苹果关于动态库的概述,
维基百科动态库
步骤1,创建libmylib.dylib库--
mymod.c:
void mymod( int x )
{
printf( "mymod: %d\n", x );
}
gcc -c mymod.c
gcc -dynamiclib -current_version 1.0 mymod.o -o libmylib.dylib
file libmylib.dylib
otool -L libmylib.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
第三步,运行callmymod以链接到libmylib.dylib库--
export DYLD_PRINT_LIBRARIES=1
./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,在Macs上为glibtool,
以及SCons。)