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