编译.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