zoukankan      html  css  js  c++  java
  • iOS 打包静态库和动态库

    静态库(.a)

    IOS产生.a的静态库,比起.framework相对简单了好些。

    下面介绍一下具体生成步骤:

    1、新建一个framework&library库。IOS 下的cocoa touch static library。然后输入product name 为libsql

    2、把libsql.h和libsql.m删除。导入ocsqlite.h和ocsqlite.c(文件见http://blog.csdn.net/fengsh998/article/details/8278978

    3、修改scheme,设为release版本。

    OK,选译ios device编译运行。成功后将在目录的build/products/release-iphoneos/下产生一个liblibsql.a文件。

    注,这里产生的是真机使用的.a文件。

    选译iphonesimulator 进行编译一次,同样会在build/products/release-iphonesimulator/下产生一个liblibsql.a文件。

    这里是虚拟机使用的.a文件。

    下面来看一下这两个文件有什么不同之处,使用lipo -info命令。

    打开终端。

    进入到相应的目录。

    真机的:liblibsql.a文件信息。

    input file liblibsql.a is not a fat file

    Non-fat file: liblibsql.a is architecture: armv7

    如图:

    模拟器的:liblibsql.a文件信息。

    input file liblibsql.a is not a fat file

    Non-fat file:  liblibsql.a  is architecture: i386

    如图:

    如果使用真机和模拟器通用,则需要将这两个文件合并,使用命令lipo -create  xxxx/liblibsql.a   xxxxx/liblibsql.a  -output  libsql.a

    同样可以使用lipo -info 来查看这个合并的libsql.a

    可以看到architectures in the fat file: libsql.a are: i386  armv7

    如图:

    动态库(.framework)

    IOS中静态库的方式有*.a或*.framework。个人感觉不论是.a还是.framework其实无外于对源码进行隐藏的一种表现方式。

    许多时在项目中,往往对于积累沉垫下来很少改动的代码(高内聚,低耦合的代码),为了增加重用性,常常都进行库的封装好存。

    在WIN上封装为DLL(动),LIB(静)。在LINUX上封装为.SO(动),.a(静)。

    便于介绍对类库的framework编写,这里将http://blog.csdn.net/fengsh998/article/details/8278978中的ocsqlite.h和ocsqlite.m的源码制作成静态库(framework)

    废话少说,开始编写IOS的framework类库。

    平台:VM+MAC OS10.6+XCode4.2

    1、新建一个静态库工程。file--new--project,弹出框中选择Ios--framework&library中的cocoa touch static library.点击NEXT。输入product name

    这里为fmwksqlite

    新建好的工程如下图:

    图中默认情况下建的是.a的静态库工程。可以从products中看到最终输出的是libfmwksqlite.a的静态库文件。

    由于IOS直接生成提.a静态库,因此要手动把库修改为framework。因此需要把当前的targets文件删除。如图:

    2、把原来的targets删除了,需要新建一个新的targets。file-new-targets

    弹出的框中选择mac osx下的framework&library中的bundle (因为IOS TOUCH中没有Bundle所在使用MAC下的Bundle来改制),输入product name,这里可以输入和工程相同的名称(这里可以减少一点点麻烦),个人不太喜欢按步造班,所以自己另取一个targets名称,这里为tgfwmk。

    新建完成如图:

    把新建的target产生的多余文件删除,当前没有用到所以就删除咯。只需要保留targets的配置文件即可。删除后如图:

    文件夹中的文件:

    将新建的targets进行修改几个必要项。(关键设置)

    详细步骤:

    1、选中tgfmwk中的Build settings 。

    2、修改Build settings页中的Base SDK的值为least ios5.0(注我的SDK是5.0的,根据按装的SDK来定)

    3、修改Build settings页中的Architectures 的值改为Standard(armv7)

    4、修改Build settings页中的Build Active Architecture only 值为NO

    5、修改Build settings页中的Link With Standard Libraries 值改为NO

    6、修改Build settings页中的Mach-O Type 为Relocatable Object File

    7、修改Build settings页中的Wrapper Extension 为framework

    8、修改Build settings页中的Dead Code Stripping 为NO

    (下面的步聚是由于新建的targets文与项目名称不对应导致要手动修改的地方,如果是同名就不用理会下面的步骤了)

    9、修改Build settings页中的info.plist File 为fmwksqlite/tgfmwk-info.plist未改前为tgfmwk/tgfmwk-info.plist(因为我将这个文件移到了项目目录下)

    10、修改Build settings页中的GCC_PREFIX_HEADER改为fmwksqlite/fmwksqlite-Prefix.pch未改前为tgfmwk/tgfmwk-Prefix.pch

    以上修改完成后就可以选模拟器平台运行还是设备运行了。这里先选模拟器(iphonesimulator)点击RUN。正常情况下应该是运行成功。

    但这个时候只是产生了一个空的tgfmwk.framework里面并没有库文件和头文件输出。

    下面是如何添加类文件以编译产生相应的库文件。

    把默认的fmwksqlite.h 和fmwksqlite.m文件删除。添加ocsqlite.h和ocsqlite.m文件进来

    3、添加编译文件和头文件。操作如下:

    打开tgfmwk下的build parses点击add bulids parses 弹出中选择add copy headers

    然后在头文件项中添加ocsqlite.h 为public headers

    上面OK之后就可以编译,成功后,将会在Build/products/debug-iphonesimulator/tgfmwk.framework下产生库文件。

    到这里一个模拟器版本的framework就制作OK。使用时只需要将tgfmwk.framework整个文件夹COPY到相应的项目下就可以使用了。正真发布时最好使用Release版本。

    下面介绍一下如何使用整个framework 即可模拟器使用也可以真机使用。

    演示前先输入iphoneos(真机)和iphonesimulator(模拟器)版本的tgfmwk.framework,这里使用的是Release版。(product--edit scheme)

    输出后可以在DeviceData/fmwksqlite/build/products/

    下面是合并的关键,

    先来看一下framework中的tgfmwk

    打开终端。输入pwd 先看一下当前所在的目当路径。使用ls 查看当前目录下的文件夹。

    cd /users/[用户名]/Desktop/fmwksqlite/DerivedData/fmwksqlite/build/products/release-iphoneos/tgfmwk.framework

    然后使用lipo -info tgfmwk 查看一下库的信息。

    看到输出Non-fat file: tgfmwk is architecture: armv7

    这里表明只支持真机。

    同样的再来看看模拟器的。

    cd /users/[用户名]/Desktop/fmwksqlite/DerivedData/fmwksqlite/build/products/release-iphonesimulator/tgfmwk.framework

    然后使用lipo -info tgfmwk 查看一下库的信息。

    看到输出Non-fat file: tgfmwk is architecture: i386

    可见要想真机和模拟器都可以使用该framework需要将这两个版本的tgfmwk文件进行合并。

    使用命令lipo -create xxxx/tgfmwk  xxxxx/tgfmwk  -output  tgfmwknew

    其中xxxx表示路径,一个是真机的tgfmwk所在路径,一个是模拟器tgfmwk文件所在路径,然后输出tgfmwknew新的文件。输出后,只需要将这个tgfmwknew重命名为tgfmwk然后复盖原来的tgfmwk 文件即可。把复盖后的这个tgfmwk.framework考出来到具体使用的项目就可以实现真机和模拟器通用的framework 了。

    看一下tgfmwknew的信息。

    显示:Architectures in the fat file: tgfmwknew are : armv7  i386

    可见这个合并的文件已具备了armv7(真机)和i386(虚拟机)的能力。

    由于OCSqlite这个类使用到了libsqlite3.dylib ,所在在调用framework库时也需要添加这个动态库。

    本节完,下节将介绍.a的静态库。.a的比framework相对少了不少工作。呵呵。

  • 相关阅读:
    8.池化内存分配
    7.netty内存管理-ByteBuf
    6.ChannelPipeline
    5.接入客户端连接
    4.Netty执行IO事件和非IO任务
    3.NioEventLoop的启动和执行
    2.NioEventLoop的创建
    1.netty服务端的创建
    微信订阅号开发初探
    jmeter自动化脚本编写
  • 原文地址:https://www.cnblogs.com/xincc/p/3821940.html
Copyright © 2011-2022 走看看