[学习记录]编译.a静态库尝试及问题记录

编译.a静态库尝试及问题记录


操作步骤如下:

1.创建Library项目,用于编译.a静态库

2.项目加入简单代码

3.设置项目属性,生成Debug/Release

4.编译项目,生成.a文件

5.创建测试项目,引用.a文件

6.编译及处理可能出现的错误

7.其他需要注意的内容

8.通用静态库的制作



好了,开始吧


1.创建Library项目,用于编译.a静态库


打开Xcode,选择创建一个新项目,如下图:



然后选择库模版,如下图:



然后输入你的项目名称,我这里写的是TestLib,如下图:



然后就选择创建项目的路径,我选择桌面,如下图:




2.项目加入简单代码


创建完毕会弹出项目属性窗口,先不用配置,先来打开头文件跟.m文件,输入简单的代码,如下图:


头文件代码如下:


//
//  TestLib.h
//  TestLib
//
//  Created by yufeng on 15/5/15.
//  Copyright (c) 2015年 kingsley. All rights reserved.
//

#import <Foundation/Foundation.h>
@interface TestLib : NSObject
- (void)printA;
+ (void)printB;
@end
.m文件代码如下:


//
//  TestLib.m
//  TestLib
//
//  Created by yufeng on 15/5/15.
//  Copyright (c) 2015年 kingsley. All rights reserved.
//

#import "TestLib.h"

@implementation TestLib
- (void)printA{
    NSLog(@"AAA");
}
+ (void)printB{
    NSLog(@"BBB");
}
@end


3.设置项目属性,生成Debug/Release

添加完代码之后当然就是准备编译咯,在编译之前,先来配置一下生成Debug版还是Release版,如果你要使用这个静态库的项目是Debug版那你就设置为Debug版,不过通常情况下静态库都是发布板的,我们选择生成为Release,如下图:



按照上面的操作步骤,就可以配置好发布的版本类型了。


4.编译项目,生成.a文件

按下快捷键 CMD + B 生成项目,也可以直接点“RUN”按钮来生成。

在左侧面板Products下面找到我们编译生成的libTestLib.a这个文件,(注意未编译前文件名称为红色,编译后文件名称为黑色)。


可能遇到的问题:


问题1:Unable to run command 'Libtool XXXXXX.a' - this target might include its own product.

原因:在Products的信息的第二个选项Targets下,有Target Memberships选项。这项不应该选中,而我选中了,导致编译报错。

解决方法:去掉勾勾,如下图:



 问题2: No code signing identities found: No valid signing identities (i.e. certificate and private key pair) matching the team ID “(null)” were found.

原因:编译证书什么的问题,这个是真机调试出现的问题,我暂时没有设备,只有别人的一些解决方法。

解决方法:把证书账号中的Identifiers、Certificates和Provisioning Profiles中的内容全部删除了。然后重新请求证书进行调试。最后成功在真机上面运行。参考http://stackoverflow.com/questions/19197497/ios-7-0-no-code-signing-identities-found


问题3:CodeSign error: code signing is required for product type 'Unit Test Bundle' in SDK 'iOS 8.3'

原因:代码签名证书不对劲。

解决方法:

(1).选择工程->Build Settings -> Code Signing -> Code Signing Identity -> Debug -> Any ios SDK 将选项改为:iPhone Developer

(2).重新下载你的证书,或者修改通配符,或者说修改你的appid 。选择工程 -》Bundle Identifier  修改为最新的appid 。造成这种原因是因为你修改了你的app sdk版本

(3).如果还不行,可以试试:Edit Project Setting 下面的那个菜单:Edit Active Target “Hello World” ->Build -> Code Signing -> Any ios 的值设置为iPhone Developer



编译成功之后,我们可以来查看.a文件的属性,在左侧Products下的libTestLib.a点击右键,选择"Show In Finder",在文件夹中显示,右键"显示简介",可以得到文件的路径位置。

打开终端,使用cd命令移动到.a文件所在目录,然后使用"lipo -info libTestLib.a"命令来查看.a文件支持的CPU架构。

<p style="margin-top: 0px; margin-bottom: 0px; font-size: 11px; font-family: Menlo;">cd /Users/yufeng/Library/Developer/Xcode/DerivedData/TestLib-bficprcajkksrpaxarcmmeomvddx/Build/Products/Release-iphonesimulator</p>lipo -info libTestLib.a


我这里显示的是 i386 x86_64 ,说明的是,我这个.a文件只支持在i386跟x86_64架构的CPU上运行。(当然如果你是要在真机上运行的话是不行的,iphone手机是arm构架,这个.a在上面是不能运行的)


5.创建测试项目,引用.a文件

打开Xcode,选择创建一个新项目,然后选择控制台,如下图:


然后填写项目名称,选择创建的路径

在左边项目里面->添加文件(Add Flies to "项目名称")->选择TestLib.h ->添加,这里.h文件添加完成



接下来引用.a文件,按照以下步骤添加:


至此,.h文件跟.a文件都添加完成,照理来说可以调用.a静态库里的功能了,来试一下,选择左侧main.m文件,打开后输入调用代码:

//
//  main.m
//  测试调用静态库
//
//  Created by yufeng on 15/5/14.
//  Copyright (c) 2015年 kingsley. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "TestLib.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        [TestLib printB];
        TestLib * test = [[TestLib alloc] init];
        [test printA];
    }
    return 0;
}



6.编译及处理可能出现的错误

添加完成之后来测试一下,点击运行:

正常情况下如果成功的话,就是直接通过,在控制台输出如下内容:



当然也有出现错误的情况:


ld: warning: ignoring file /Users/yufeng/Desktop/Code/进阶学习/测试调用静态库/测试调用静态库/libTestLib.a, missing required architecture x86_64 in file /Users/yufeng/Desktop/Code/进阶学习/测试调用静态库/测试调用静态库/libTestLib.a (2 slices)

Undefined symbols for architecture x86_64:

  "_OBJC_CLASS_$_TestLib", referenced from:

      objc-class-ref in main.o

ld: symbol(s) not found for architecture x86_64


错误原因:导入错误的编译版本,可能库文件(.a)为真机版本,你却用模拟器来调试程序。

解决方法:

(1).将调试目标换成真机即可。

(2).重新编译.a文件,生成配置选择模拟器版本。


clang: error: linker command failed with exit code 1 (use -v to see invocation)

错误原因:找不到文件导致的链接错误。

解决方法:

(1).查看库文件是否存在或者版本是否正确

(2).参考http://blog.csdn.net/hengshujiyi/article/details/21182813


7.其他需要注意的内容

如何生成真机版静态库或者模拟器版静态库,操作步骤:


直接在设备选项中选择对应类型即可。

生成的文件中,会有一个Release-iphoneos文件夹,还有一个Release-iphonesimulator文件夹,后面是iphoneos的是真机版的文件,后面是iphonesimulator的是模拟器版的文件,添加时一定要注意看清楚了。



8.通用静态库的制作

如果,你的调试需要不断在真机和模拟器之间切换。那么,制作一个通用的静态库.a文件是一个好想法。
这样,使用该静态库文件就可以在真机和模拟器上调试。制作过程也是非常简单。


打开终端,命令如下:

lipo -create 真机版路径/XXX.a 模拟器版路径/XXX.a -output 输出路径/XXX.a


生成通用静态库,通用版本大小>=模拟器版本大小+真机版本大小。

参考文章http://blog.sina.com.cn/s/blog_7b9d64af0101jlym.html


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值