iOS a/framewortk/bundle 教程
参考:
静态库和动态库
静态库和动态库的存在形式
静态库: .a 和 .framework
动态库: .dylib 和 .framework
静态库和动态库在使用上的区别
静态库:链接时,静态库会被完整地复制到可执行文件中, 被多次使用就有多份冗余拷贝 (左图所示)
动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存
如果想让一个 .a 文件能同时用在真机和模拟器上,需要进行合并
在终端输入指令
lipo -create Debug-iphoneos/libMJRefresh.a Debug-iphonesimulator/libMJRefresh.a -output libMJRefresh.a
.a 文件的体积(一般情况下)
真机用的 .a > 模拟器用的 .a
所合成 .a == 真机用的 .a + 模拟器用的 .a
通过 lipo –info libMJRefresh.a 可以查看 .a 的类型(模拟器还是真机)
# define output folder environment variable UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal # Step 1. Build Device and Simulator versions xcodebuild -target ImageFilters ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" xcodebuild -target ImageFilters -configuration ${CONFIGURATION} -sdk iphonesimulator -arch i386 BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" # make sure the output directory exists mkdir -p "${UNIVERSAL_OUTPUTFOLDER}" # Step 2. Create universal binary file using lipo lipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/lib${PROJECT_NAME}.a" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/lib${PROJECT_NAME}.a" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/lib${PROJECT_NAME}.a" # Last touch. copy the header files. Just for convenience cp -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/include" "${UNIVERSAL_OUTPUTFOLDER}/"
https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/xcodebuild.1.html
代码并不十分复杂,它是这样工作的:
UNIVERSAL_OUTPUTFOLDER 包括了通用二进制包将要被存放的文件夹:“Debug-universal”
Step 1. 第2行执行了xcodebuild并命令它构建ARM架构的二进制文件。(你可以看到这行中的-sdk iphoneos参数)
下一行再次执行了xcodebuild命令并在另一个文件夹中构建了一个针对Inter架构的iPhone模拟器的二进制文件,在这里关键参数是-sdk iphonesimulator -arch i386。(如果感兴趣,你可以在man page了解更多关于xcodebuild的资料)
Step 2. 现在已经有了2个.a文件分别对应两个架构。执行lipo -create,用它们创建出一个通用二进制。
最后一行的作用是复制头文件到通用构建文件夹的外层。(用cp命令)
有两种办法可以将静态库引入到工程中:
方法 1: 直接引用头文件和库二进制文件(.a)
方法 2: 将库工程作为子项目
方法 1: 头文件和库二进制文件
注意: 标准的Unix引入惯例是一个include文件夹,用来存放头文件,一个lib文件夹用来存放库文件(.a)。这种文件夹结构这是一种惯例,并不强制。你并不需要一定遵从这种结构或者复制文件到工程文件夹中。在你自己的应用中,你可以任意选择头文件和库文件的位置,只要随后在Xcode工程中设置了适当的路径。
双击Header Search Paths项,弹出一个浮动窗口,点击+按钮,输入:
- $SOURCE_ROOT/include
$SOURCE_ROOT是一个Xcode环境变量,指向工程根文件夹。
2、在原有工程上添加一个静态库
2.1、选择OS X 的Bundle。因为Xcode6.1中iOS里没有Bundle。
2.2、修改Bundle的属性,一是让他能用在iOS上。二是改变Bundle成为Framework选中要修改的Bundle
2.3、Target:并选择 Build Settings -> Architectures -> Base SDK 改为Latest iOS(ios 8.1)
2.4、Target:在 Deployment 下,将 “Mac OS X Deployment Target”改成”Compiler Default”,
将 “Targeted Device Family”改成”iPhone/iPad”,根据自己的需要改。如果你只想在iPhone上用,那选iPhone就行
将 “iOS Deployment Target”,改成 “iOS 7.0”:也就是说这个静态库支持7.0以上版本。
2.5、Target:在 Linking 下,将 “Dead Code Stripping” 改为 “NO”,
将 “Link with Standard Libraries” 改为 “NO”,
将 “Mac-O Type” 改为 “Relocatable Object File”:
2.6、Target:Packaging 中,将 “Wrapper Extention” 改为“framework”:
2.6、Target:返回Info 标签。将 “Bundle OS Type Code” 改为 “FMWK”(Framework )
2.7、Target:返回Build Phases 标签。加入Copy Headers,后边会用到。 相关推荐
goawalk 2020-10-29
wordmhg 2020-06-26
Haopython 2020-05-09
吴小伟 2020-05-09
huakai 2020-05-10
spartmap 2020-04-20
qscool 2020-01-30
christinzhm 2013-06-03
wq0 2019-12-26
xuanwenchao 2019-11-29
rareli 2019-11-21
zhuxianfeng 2011-03-28
fkuevip 2011-03-09
linuxunix 2011-01-27
mojianbin 2011-07-23
plcjianghao 2011-06-17
Rafema 2011-05-22
zhjn0 2011-05-03