软件开发技术科普之二:Mac OS X共享库
2007-07-20 00:38
246 查看
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,编译之——成功!
原载:http://www.3exware.com/home/default.asp?id=22
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,编译之——成功!
原载:http://www.3exware.com/home/default.asp?id=22
相关文章推荐
- 软件开发技术科普之一:ODBC科普
- 软件测试开发技术Java初学者需要了解的几个基础问题
- 粤嵌JAVA实时网络培训,让你拥有高超的软件开发技术
- 一起谈.NET技术,.NET 分布式架构开发实战之二 草稿设计
- 微软软件实现技术授课系列内容之二:C++ Best Coding Practice
- (转载)技术族谱:软件开发相关知识体系的整理心得(图)
- 2006年软件开发技术预测
- 软件开发技术高手转向项目管理者要突破的误区
- 微软软件开发技术二十年回顾1985-2006
- 广州软件开发技术书籍购书之惑
- 2007年软件开发技术预测集锦-Java,软件开发,Ajax
- 谈:"沉重的翅膀——软件开发,业务?技术? "
- 谈:"沉重的翅膀——软件开发,业务?技术? "
- 对日软件开发体会之二
- 基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET - 文章汇总及学习指南
- 京东价格监控软件开发技术探讨二:通过HttpWebRequest获取指定网页数据
- 微软软件开发技术二十年回顾
- 2006年软件开发技术预测
- 开发好一个软件功能模块不是光有激情、有干劲、有技术就可以得到成功的
- 软件技术积累-问题引出之二