app开发iOS 基础与进阶iOS开发攻城狮的集散地

静态库动态库使用实践

2016-12-19  本文已影响343人  暴走大牙

周末看了 @落影loyinglin 的文章 编译与链接过程的思考 发现对库的使用有一些错误的认识,于是又看了这里两篇文章,对于静态库的使用比较好理解,但是对于动态库的使用还是有些疑惑。这里我只是单纯的记录一些使用,上传了一个实践testLib Demo,以后还需要从原理上再进一步认识。

从Xcode 6 开始,iOS 平台是准许自创建动态库的,选择 Cocoa Touch Framework:

选择 Cocoa Touch Static Library创建静态库 a.a:

从上面可以看到 *.a 和 Mach-O Type 为 Static 的 *.framework 在Linked Frameworks and Libraries 效果是不同的,Xcode 在LD参数上处置不同。

可见,在多个库,且库与库直接有相互依赖,在加上C没有命名空间,很容易出现符合重定义或者出现与你期望不一致的行为。接下来简单的分析下 实践testLib Demo,大家可以在上面修改折腾一下。

  1. 静态库ALib.framework
void foo()
{
     printf("foo in ALib.\n");
}
  1. 动态库BLib.framwork,且关联依赖静态库ALib.framework
void boo()
{
    printf("boo in BLib.\n");
}
void call_foo_b()
{
    printf("call_foo in BLib.\n");
    foo();
}
  1. 静态库CLib.framework
void foo()
{
     printf("foo in CLib.\n");
}
  1. 动态库DLib.framwork,且关联依赖静态库CLib.framework
void boo()
{
    printf("boo in DLib.\n");
}
void call_foo_b()
{
    printf("call_foo in DLib.\n");
    foo();
}
  1. testLib 程序
-(void)testLib {
    NSLog(@"Test lib.");
    call_foo_b();
    call_foo_d();
    foo();
    boo();
}
Paste_Image.png

并不需要关联依赖ALib.framework 和 BLib.framwork,那testLib 会输出什么样的结果呢?

Paste_Image.png

项目中遇到类似的情景:库A依赖FFmpeg 2.8版本,库B依赖FFmpeg 3.2版本,程序同时依赖库A和库B,希望各自都能正确的调用相应的FFmpge版本。那参照Demo的行为,把FFmpeg 2.8版和3.2版编译为静态库,库A和库B为动态库便可。

上一篇 下一篇

猜你喜欢

热点阅读