你说的静态库和动态库吧?编译速度没有太大的区别,在实际运行时,静态库运行较快,而动态库内地函数由于在实际使用到时才加载到内存,所以运行较慢。动态库的好处是只要保持接口不变,就可以在程序运行时进行动态库的切换。
② 如何提高ios 静态库的编译速度
iPhone何打包通用静态库文件(模拟器真机都用)
1.先必须命令:
~/Library目录lion默认隐藏便用命令使其显示:
chflags nohidden ~/Library
想再让其隐藏:
chflags hidden ~/Library
2.静态库工程建立:Xcode New新project选择IOS面Framework&Library面Cocoa Touch Static Library直接next建立MtimeLibrary工程(面功能要关注简单 2数相加)
?
3.工程建立删除默认.h .m 文件自创建CountNumbers..h CountNumbers..m文件图:
4.OK选择iPhone 5.1Simulator ,Command + B 编译我Procts面找我编译模拟器运行libMtimeLibrary.a文件,选择真机(图)再编译真机运行libMtimeLibrary.a库
?
5. libMtimeLibrary.a 右键 Open in Finder找libMtimeLibrary.a所路径、面我新建项目添加.a文件测试
打终端:输入命令(路径根据自决定)
cd /Users/cash/Library/Developer/Xcode/DerivedData/MtimeLibrary-amyqbnwwzcivnyeijggzaorseihj/Build/Procts/
Procts目录ls 看:
?
再输入命令: cd Debug-iphonesimulator/
通面命令查看libMtimeLibrary.a信息
命令:lipo -info libMtimeLibrary.a
显示:
cashmatoMacBook-Pro:Debug-iphonesimulator cash$ lipo -info libMtimeLibrary.a
input file libMtimeLibrary.a is not a fat file
Non-fat file: libMtimeLibrary.a is architecture: i386
i386mac架构
再输入面命令:
cd ../
cd Debug-iphoneos/
继续通命令查看 lipo -info libMtimeLibrary.a
显示:
cashmatoMacBook-Pro:Debug-iphoneos cash$ lipo -info libMtimeLibrary.a
input file libMtimeLibrary.a is not a fat file
Non-fat file: libMtimeLibrary.a is architecture: armv7
armv7iOSjia'ge架构
我明白真机使用能模拟器使用吧
我要做要让libMtimeLibrary.a文件同i386armv7信息通用静态库文件
6. 新建MtimeLibraryDemo应用真机或者模拟器libMtimeLibrary.a CountNumbers.h文件引入进图:
?
添加CountNumbers.h文件需要调用类面调用libMtimeLibrary.a面
//
// AppDelegate.m
// MtimeLibraryDemo
//
// Created by cash on 12-3-23.
// Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import "AppDelegate.h"
#import "CountNumbers.h"
@implementation AppDelegate
@synthesize window = _window;
- (void)dealloc
{
[_window release];
[super dealloc];
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
// Override point for customization after application launch.
CountNumbers *cn = [[CountNumbers alloc] init];
int count = [cn addTwoNumbers:10 :20];
NSLog(@"count:%d",count);
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
7. OK编译运行应用程序 错误篇文档关键.
?
我找刚才真机模拟器libMtimeLibrary.a目录
debug-iphoneos面基于arm6 arm7编译库文件debug-iphonesimulator文件夹面基于i386编译文件
?
10. 关键步骤:
通lipo -create 命令合并2静态库文件(-output 面/Users/cash/Desktop/test/libMtimeLibrary.a 合并路径文件名字)
lipo -create "/Users/cash/Library/Developer/Xcode/DerivedData/MtimeLibrary-amyqbnwwzcivnyeijggzaorseihj/Build/Procts/Debug-iphonesimulator/libMtimeLibrary.a" "/Users/cash/Library/Developer/Xcode/DerivedData/MtimeLibrary-amyqbnwwzcivnyeijggzaorseihj/Build/Procts/Debug-iphoneos/libMtimeLibrary.a" -output "/Users/cash/Desktop/test/libMtimeLibrary.a"
功
通命令 lipo -info libMtimeLibrary.a 知道文件已经i386armv7信息
cashmatoMacBook-Pro:test cash$ lipo -info libMtimeLibrary.a
Architectures in the fat file: libMtimeLibrary.a are: i386 armv7
cashmatoMacBook-Pro:test cash$
w
③ 如何加快xcode编译速度
1. 增加XCode执行的线程数
可以根据自己Mac的性能,更改线程数设置5:defaults write com.apple.Xcode 5
另外也有一个设置可以开启:defaults write com.apple.dt.Xcode ShowBuildOperationDuration YES
XCode默认使用与CPU核数相同的线程来进行编译,但由于编译过程中的IO操作往往比CPU运算要多,因此适当的提升线程数可以在一定程度上加快编译速度。
2.将Debug Information Format改为DWARF
在工程对应Target的Build Settings中,找到Debug Information Format这一项,将Debug时的DWARF with dSYM file改为DWARF。
这一项设置的是是否将调试信息加入到可执行文件中,改为DWARF后,如果程序崩溃,将无法输出崩溃位置对应的函数堆栈,但由于Debug模式下可以在XCode中查看调试信息,所以改为DWARF影响并不大。这一项更改完之后,可以大幅提升编译速度。
比如在目前本人负责的项目中,由于依赖了多个Target,所以需要在每个Target的Debug Information Format设置为DWARF。顺便提一下,如果通过Cocoapod引入第三方则Debug Information Format默认就是设置为DWARF的。
SDWebImage通过Cocoapod``Debug Information Format的默认设置
注意:将Debug Information Format改为DWARF之后,会导致在Debug窗口无法查看相关类类型的成员变量的值。当需要查看这些值时,可以将Debug Information Format改回DWARF with dSYM file,clean(必须)之后重新编译即可。
3.将Build Active Architecture Only改为Yes
在工程对应Target的Build Settings中,找到Build Active Architecture Only这一项,将Debug时的NO改为Yes。
664334-fa1eb995c140ce0f.png
这一项设置的是是否仅编译当前架构的版本,如果为NO,会编译所有架构的版本。需要注意的是,此选项在Release模式下必须为NO`,否则发布的ipa在部分设备上将不能运行。这一项更改完之后,可以显着提高编译速度。
4.设计编译优化等级
不要再项目中或者静态库中使用-O4,因为这会让Clang链接Link Time Optimizations (LTO)使得编译更慢,通常使用-O3。
注意:在设置编译优化之后,XCode断点和调试信息会不正常,所以一般静态库或者其他Target这样设置。
4.资源整合
4.1 将常用的代码及文件打包成静态库
4.2 添加预编译文件,把常用的头文件放到预编译文件里面
4.3 能用@class就用@class
④ linux 静态库和动态库编译的区别
Linux库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀。例如:libhello.so libhello.a
为了在同一系统中使用不同版本的库,可以在库文件名后加上版本号为后缀,例如: libhello.so.1.0,由于程序连接默认以.so为文件后缀名。所以为了使用这些库,通常使用建立符号连接的方式。
ln -s libhello.so.1.0 libhello.so.1
ln -s libhello.so.1 libhello.so
动态库和静态库的区别:
当要使用静态的程序库时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,所以一旦连接成功,静态程序库也就不再需要了。然而,对动态库而言,就不是这样。动态库会在执行程序内留下一个标记‘指明当程序执行时,首先必须载入这个库。由于动态库节省空间,linux下进行连接的缺省操作是首先连接动态库,也就是说,如果同时存在静态和动态库,不特别指定的话,将与动态库相连接。
两种库的编译产生方法:
第一步要把源代码编绎成目标代码。以下面的代码hello.c为例,生成hello库:
/* hello.c */
#include
void sayhello()
{
printf("hello,world\n");
}
用gcc编绎该文件,在编绎时可以使用任何全法的编绎参数,例如-g加入调试代码等:
gcc -c hello.c -o hello.o
1.连接成静态库
连接成静态库使用ar命令,其实ar是archive的意思
$ar cqs libhello.a hello.o
2.连接成动态库
生成动态库用gcc来完成,由于可能存在多个版本,因此通常指定版本号:
$gcc -shared -Wl,-soname,libhello.so.1 -o libhello.so.1.0 hello.o
另外再建立两个符号连接:
$ln -s libhello.so.1.0 libhello.so.1
$ln -s libhello.so.1 libhello.so
这样一个libhello的动态连接库就生成了。最重要的是传gcc -shared 参数使其生成是动态库而不是普通执行程序。
-Wl 表示后面的参数也就是-soname,libhello.so.1直接传给连接器ld进行处理。实际上,每一个库都有一个soname,当连接器发现它正在查找的程序库中有这样一个名称,连接器便会将soname嵌入连结中的二进制文件内,而不是它正在运行的实际文件名,在程序执行期间,程序会查找拥有 soname名字的文件,%B