软件开发技术科普之二:Mac OS X共享库

    Windows、Mac OS X和Linux的动态链接库/共享库各有千秋。在这里简单介绍下Mac OS X的共享库。Mac OS X的内核是BSD和Mach混合而成的。由于Mach核心处理CPU相关的最核心的任务,包括线程调度等,因此Mac OS X的原生可执行文件是Mach-O(O是Object的缩写)格式。因此Mac OS X的共享库也一般基于该格式。
    Mac OS X除了有框架和包罗框架(又译伞状框架,两者的扩展名都为.framework的包,在此不多做介绍)之外,还有两种共享库格式。一种的扩展名为.dylib,被称为MH_DYLIB格式,是一种仅仅在内存中共享代码的简单的动态库,它不能被其它代码显式的载入。一般在XCode直接创建的BSD、Carbon或Cocoa动态库并进行编译,就能得到这种库。
    另外有一种能被代码(一个程序或另一个共享库)显式载入的“插件”库,它是.so的单一格式文件,或者为.bundle的包(如果有相关资源的话,实际上包中的主程序也是.so格式的库)。它被称为MH_BUNDLE。比如ODBC Driver在Mac上一般应该被编译为这种格式,这样它才能被ODBC Driver Manager(也是一个共享库,请参见
软件开发技术科普之一)显式载入。MS Office的Mac版中的一些.bundle包也是这种格式的动态库。
    用XCode 2.2以上版本编译MH_BUNDLE有些麻烦,曾一度被怀疑为Bug,并在国外一些知名苹果软件开发论坛或邮件列表中有相关的讨论,做法如下:
1、双击Targets中的项目
2、弹出Target Info对话框,切换到Build选项卡以修改其中的选项(每个选项均对应一个GCC 4的编译选项)
3、将Mach-O Type改为bundle
4、此时如在XCode 2.2以上(我用的是2.4)中编译会遇到编译器错误:-compatibility_version only allowed with -dynamiclib,无法link。
5、打开Target Info对话框,在build面板中找到Current Library Version项,默认值为1,单击Edit,清空随后弹出的下拉对话单(sheet window)中的内容,注意直接将1删除是没用,XCode还会把它改回来。
6、再次编译,遇到错误-current_version only allowed with -dynamiclib
7、回到Target Info对话框,找到并用同样的办法清空Compatibility Version。
8、第三次编译,会显示-single_module or -multi_module flags can only be used when -dylib is also specified错误。
9、再次回到Target Info对话框,在build面板中找到Perform Single-Object Prelink,将其选中。
10、这次编译应该能通过了,在编译前,最好将Executable Extension(文件扩展名)改为.so。
11、可以在Build Results窗口(单击主窗口右下角──状态栏最右边的链接)中,将编译设置改为release,编译之——成功!



[本日志由 kmzs 于 2007-08-01 00:39 AM 编辑]
上一篇: 软件开发技术科普之一:ODBC科普
下一篇: 价格管制下免税后的效率问题(答友人问)
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: 软件开发 Mac XCode GCC
相关日志:
评论: 0 | 引用: -10 | 查看次数: -
发表评论
昵 称:
密 码: 游客发言不需要密码.
邮 箱: 支持Gravatar头像.
网 址: 输入网址便于回访.
内 容:
验证码:
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.