iOS中创建动态库及调用方法

  去年因需要用到动态库,自己就找了好多一些 资料,最终找到了一套方法,怎么创建与使用动态库,记录一下:

  Xcode提供了在iOS工程中创建静态库的功能,和在MAC上创建动态库和静态库的功能。

但是没有提供在iOS工程中创建动态库的功能(苹果官方不允许程序中存在动态库链接,这样的程序会被AppStore拒),如下图:

   由于苹果不支持自己创建iOS动态库,所以要想创建动态库首先要修改Xcode的配置文件使其支持具备创建iOS 动态库的功能,

经过调研和查询网上的一些资料,并经过自己测试成功,以下是修改方案。

  1. 在Finder中打开2个目录:(注意若装有多个Xcode,Xcode命名不同的话要把下面的Xcode.app改为自己Xcode的名字:如,电脑上的名字为Xcode5.1,则对应改为xcode5.1.app)

    目录一:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Specifications/

    目录二:/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Xcode/Specifications/

    其中目录一对应的是Xcode下创建iOS工程的配置文件,而目录二时Xcode下创建MacOSX的配置文件。(这里只说iOS真机版,模拟器版类似,/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform)

  2. 把目录一下的iPhoneOSPackageTypes.xcspec和iPhoneOSProductTypes.xcspec拷贝到桌面(或者其它有写权限的地方),分别用xcode打开。再用xcode打开目录二下的MacOSX Package Types.xcspec和MacOSX Product Types.xcspec

    把MacOSX Package Types.xcspec中Identifier为com.apple.package-type.mach-o-dylib的item,如下图

    拖到iPhoneOSPackageTypes.xcspec,令iPhoneOSPackageTypes.xcspec变成:

再把MacOSX Product Types.xcspec中Identifier为com.apple.product-type.library.dynamic的item,如下图

拖到iPhoneOSProductTypes.xcspec,令iPhoneOSProductTypes.xcspec变成:

 

  保存以上修改,把iPhoneOSPackageTypes.xcspec和iPhoneOSProductTypes.xcspec拷贝回去目录一,

  此时会因为没有写权限而提示需要鉴定,输入密码即可。

  3. 修改创建工程模板

   在Finder中打开目录:

   /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/Project Templates/Framework & Library/Cocoa Touch Static Library.xctemplate

    把以上整个文件夹复制到桌面,文件夹改名为Cocoa Touch Dynamic Library.xctemplate,

    用xcode打开里面的TemplateInfo.plist,修改三个地方:

    

    保存,然后把Cocoa Touch Dynamic Library.xctemplate拷贝回目录:

    /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/Project Templates/Framework & Library/

    然后重启Xcode即可看到能创建iOS动态库了,如图所示:

    

  上面就是修改xcode配置可以使其直接生产动态库,下面简单说一下动态库的用法:

  使用动态库时,一般不是直接把动态库添加到项目工程中,而是把动态库导入到生成的APP应用下的Documents文件夹下。

    在工程中使用动态库要引入两个头文件
#import <objc/runtime.h>    和     #import <dlfcn.h>
        然后在工程中使用如下方法:
    // 获取动态库的路径
    NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
    NSString *documentDirectory = nil;
    if ([paths count] != 0)
        documentDirectory = [paths objectAtIndex:0];

    NSString *libName = @"Test1.dylib";
    NSString *destLibPath = [documentDirectory stringByAppendingPathComponent:libName];

    //使用dlopen打开动态库,返回一个句柄
    void *lib_handle = dlopen([destLibPath cStringUsingEncoding:NSUTF8StringEncoding], RTLD_LOCAL);
    if (!lib_handle) {
        NSLog(@"Unable to open library: %s\n", dlerror());
        return;
    }

    // 获得动态库的类
    Class Test_class = NSClassFromString(@"Test1");
    if (!Test_class) {
        NSLog(@"Unable to get TestDylib class");
        return;
    }

    // 创建类实例  并调用动态库的方法 @selector(test) 中的test为动态库中的方法名
    NSObject* test = [Test_class new];
    [test performSelector:@selector(test)];

    // Close the library.
    if (dlclose(lib_handle) != 0) {
        NSLog(@"Unable to close library: %s\n",dlerror());
    }

注意: 在使用动态库时,一定要注意生成动态库的证书和测试Demo中的证书是同一个证书。

  下面是一些借鉴的资料:

http://blog.csdn.net/hursing/article/details/8951958

http://blog.csdn.net/stackhero/article/details/9032891

http://blog.csdn.net/stackhero/article/details/9032999

http://www.cocoachina.com/bbs/read.php?tid=136750&fpage=49

http://stackoverflow.com/questions/4733847/can-you-build-dynamic-libraries-for-ios-and-load-them-at-runtime

时间: 2024-10-10 23:06:20

iOS中创建动态库及调用方法的相关文章

在iOS中创建静态库

如果你作为iOS开发者已经有一段时间,可能会有一套属于自己的类和工具函数,它们在你的大多数项目中被重用. 重用代码的最简单方法是简单的 拷贝/粘贴 源文件.然而,这种方法很快就会成为维护时的噩梦.因为每个app都有自己的一份代码副本,你很难在修复bug或者升级时保证所有副本的同步. 这就是静态库要拯救你的.一个静态库是若干个类,函数,定义和资源的包装,你可以将其打包并很容易的在项目之间共享. 在本教程中,你将用两种方法亲手创建你自己的通用静态库. 为了获得最佳效果,你应该熟悉Objective-

在Linux中创建静态库.a和动态库.so

转自:http://www.cnblogs.com/laojie4321/archive/2012/03/28/2421056.html 在Linux中创建静态库.a和动态库.so 我们通常把一些公用函数制作成函数库,供其它程序使用. 函数库分为静态库和动态库两种. 1. 静态函数库 这类库的名字一般是libxxx.a:利用静态函数库编译成的文件比较大,因为整个 函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译

动态库的使用方法

在编写程序时,动态库是常常用到的工具,在vs等编程环境下只需要,完成工程的本地化配置或是直接将dll配置到环境变量即可(不推荐,毕竟小题大做了),而对于像楼主这样刚刚接触Linux操作系统的菜鸟来说,配置动态(共享)库还不是一个简单的问题. 在介绍动态库的调用方法之前,先介绍一下动态库的编译(如何生成so文件) 需要一个包含几个方法声明的头文件和对应的定义文件.例如 //so_test.h 头文件 #include "stdio.h" void test_a(); void test_

Xcode4.6创建和使用iOS的dylib动态库(转载)

此为xcode4的方法,xcode3的方法请查看 Xcode3创建和使用iOS的dylib动态库 找到两个目录,最好用两个finder窗口分别打开: 目录一: [plain] view plaincopy /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Specifications/ 目录二: [plain] view plaincopy /Applica

6.关于QT中的内存管理,动态的制作,动态库的调用,静态库的制作

 一  QT的内存管理 1  QT中的内存管理是QObject来管理的 2  QT中的内存管理没有cocos2dx中的引用计数 3  组件可以指定父对象 QTimer *timer = QTimer(this);   //这里的this实际上强制转换成为了QObject了. 4  每一个对象都有一个deleteLater()方法, QLineEdit* edit = new QLineEdit(this); delete edit;   //这里的delete马上调用析构函数对内存进行释放

BAP中创建动态内表的三种方法(转载)

BAP中创建动态内表的三种方法 第一种: 如果我们需要的动态内表字段或者动态工作区和数据字典中的类型一致,可以直接使用CREATE DATA生成,当然也可以是自定义类型. 比如要产生和数据表MARA结构一致的动态内表: DATA : DY_TABLE TYPE REF TO DATA, WA_LINE TYPE REF TO DATA. FIELD-SYMBOLS: <DYN_TABLE> TYPE STANDARD TABLE . CREATE DATA DY_TABLE TYPE TABL

VS2010创建动态库和动态库的调用

下面是自己的一些总结,(未完待续): 1.VS2010创建动态库时,与VC差不多,最后都得到的是dll,和lib,还有.h头文件. 2.当一个动态库A调用了另外一个动态库B,并且A是静态调用的(即需要了A的lib,头文件和dll文件),而程序C在使用B动态库时若是静态调用 只需要B的lib,头文件,dll和A的dll即可.-----着说的是静态调用,而动态调用还没搞.

iOS:Xcode7创建静态库

Xcode7 中创建静态库 一.简单介绍 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的分类 根据源代码的公开情况,库可以分为2种类型 (1)开源库 公开源代码,能看到具体实现 比如SDWebImage.AFNetworking (2)闭源库 不公开源代码,是经过编译后的二进制文件,看不到具体实现 主要分为:静态库.动态库 二.静态库和动态库 1.静态库和动态库的存在形式 静态库:.a 和 .framework 动态库:.dylib 和 .framework 2.静态库和

详解Xcode7中创建静态库

今天和大家一起来谈谈Xcode中的静态库,包括什么是静态库,如何在Xcode中创建静态库等内容,希望这篇Xcode教程 http://www.maiziedu.com/course/234/对打击有帮助. 一.静态库和动态库的区别: 静态库和动态库是相对编译期和运行期的,静态库以 .a 和 .framework 形式存在,链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝:动态库以 .dylib 和 .framework 形式存在,链接时不复制,程序运行时由系统动态加载到内存