动态链接库已成为现代操作系统的基本组成部分,比如windows下数不清的.dll文件和
臭名昭著的dll地狱,linux下成千上万的.so文件。mac os x下也有许多动态链接库,
他们的扩展名是.dylib。
.dylib是mach-o格式,也就是mac os x下的二进制文件格式。mac os x提供了一系列
工具,用于创建和访问动态链接库。
编译器/usr/bin/cc,也就是gcc了,apple改过的。这个主要还是一个壳,去调用其他
的一些部件。当然同时还有/usr/bin/c++,等等。
汇编器/usr/bin/as
链接器/usr/bin/ld
mac os x有个自己的工具,/usr/bin/libtool,来创建动态链接库。这个libtool不是
gnu的那个同名的libtool。我记得gnu libtool可以从fink(http://fink.sf.net)下
载,编译后得到glibtool。
下面来看看如何创建动态链接库。
首先是生成module文件,也就是.o文件。这跟一般的unix没什么区别。例如
cc -c a.c b.c
就得到a.o和b.o
可以用ld来合并.o文件,比如
ld -r -o c.o a.o b.o
这个也没什么特别。
然后可以用libtool来创建动态链接库。
libtool -dynamic -o c.dylib a.o b.o
( 这里也可以用libtool -static -o c.a a.o b.o就创建静态库)
如果用gcc直接编译,我记得linux下一般是可以
gcc -shared -o c.so a.c b.c
而在mac os x下需要
gcc -dynamiclib -o c.dylib a.c b.c
这往往也是向mac os x移植unix程序常出问题的地方。如果用autoconf/automake等
工具,出错的几率应该小一些。
接着来看看访问动态链接库的工具。
nm是最常用的,这个用法跟linux下差不多
nm c.dylib
可以看到导出符号表,等等。
另一个常用的工具是otool,这个是mac os x独有的。比如想看看c.dylib的依赖关系
otool -l c.dylib
最后说一下我对framework的理解。framework是mac os x下必不可少的部分,不妨去
看看/system/library/frameworks/下面,一大堆framework。framework是dylib的进
一步演化,它把头文件、文档、动态链接库等整合成一个有机的目录,类似一种自描
述的方式,这种做法其实在mac os x下随处可见。比如应用程序,一般都是一个目录,
譬如/applications/itunes.app目录对应应用程序itunes,双击这个目录即开始执行。
这种做法和windows下常见的一个exe/dll打天下很不相同。
framework的创建工具也是libtool,详细用法参考man。