本文目录
0、参考
https://blog.csdn.net/snaill/article/details/4092748
https://blog.csdn.net/lizhongfu2013/article/details/42387311
1、xcode和ios基本概念
1.1 clang
Clang是一个C++编写、基于LLVM、发布于LLVM BSD许可证下的C/C++/Objective-C/Objective-C++编译器。它与GNU C语言规范几乎完全兼容(当然,也有部分不兼容的内容,包括编译命令选项也会有点差异),并在此基础上增加了额外的语法特性,比如C函数重载(通过attribute((overloadable))来修饰函数),其目标(之一)就是超越GCC。
参考:https://www.oschina.net/p/clang
1.2 LLVM
LLVM是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼容已有脚本。
LLVM计划启动于2000年,最初由美国UIUC大学的Chris Lattner博士主持开展。2006年Chris Lattner加盟Apple Inc.并致力于LLVM在Apple开发体系中的应用。Apple也是LLVM计划的主要资助者。
目前LLVM已经被苹果IOS开发工具、Xilinx Vivado、Facebook、Google等各大公司采用。
LLVM官方参考:https://llvm.org/
1.3 xcrun
1.4 xcode
Xcode 是运行在操作系统Mac OS X上的集成开发工具(IDE),由Apple Inc开发。Xcode是开发 macOS 和 iOS 应用程序的最快捷的方式。Xcode 具有统一的用户界面设计,编码、测试、调试都在一个简单的窗口内完成。
1.5 Objective-C
Objective-C,通常写作ObjC或OC和较少用的Objective C或Obj-C,是扩充C的面向对象编程语言。它主要使用于Mac OS X和GNUstep这两个使用OpenStep标准的系统,而在NeXTSTEP和OpenStep中它更是基本语言。
GCC与Clang含Objective-C的编译器,Objective-C可以在GCC以及Clang运作的系统上编译。
1980年代初布莱德·考克斯(Brad Cox)在其公司Stepstone发明Objective-C。他对软件设计和编程里的真实可用度问题十分关心。Objective-C最主要的描述是他1986年出版的书 Object Oriented Programming: An Evolutionary Approach. Addison Wesley. ISBN 0-201-54834-8.
2、xcode工程建立和配置(ios手机测试库功能的方法)
2.1 xcode新建工程:
(1)用于单元测试:
File–>new—>Project—>iOS(application)–>选择single view Application,然后根据提示选择工程路径,即可完成工程的创建。
(2)用于库测试:
File—>new—>Project—>iOS(FrameWork & Library)—>选择Cocoa Touch Static Libarary,然后根据提示选择工程路径,即可完成工程的创建。
2.2 xcode工程配置:
(1)在左上角工程文件名称旁边选择设备名称;
(2)在执行工程之前,单击工程名称,需要检查如下配置:
a. 单击工程名,在General菜单栏中确认Linked Framework and Libararies下是否需要添加的码流文件或者库文件等;Build Phases中确认Complie Sources(需编译的资源)和Linked Binary with Libaraies(库文件)等。
注意事项:库文件添加必须通过Build Phases中Linked Binary with Libaraies添加,不能通过将资源拖拽到包(工程)中!
b. 在Build Setting中确认Architectures:
下面三个选项是与架构平台相关的选项:
Architectures:
Space-separated list of identifiers. Specifies the architectures (ABIs, processor models) to which the binary is targeted. When this build setting specifies more than one architecture, the generated binary may contain object code for each of the specified architectures.
ONLY_ACTIVE_ARCH:在需要编译全平台的ios可执行文件时,设置为no,此时VALID_ARCHS无效;否则单独编译某个平台的ios可执行文件时,设置为yes。设置为yes,只编译当前的Architecture和ONLY_ACTIVE_ARCH交集的版本。该选项用于指定是否只对当前连接设备所支持的指令集编译。在xcode6.1中VALID_ARCH默认指定为Standard architectures(armv7,arm64),这样会编译打包32位和64位的代码。
当其值设置为YES,这个属性设置为yes,是为了debug的时候编译速度更快,它只编译当前的architecture版本,而设置为no时,会编译所有的版本。 编译出的版本是向下兼容的,连接的设备的指令集匹配是由高到低(arm64 > armv7s > armv7)依次匹配的。比如你设置此值为yes,用iphone4编译出来的是armv7版本的,iphone5也可以运行,但是armv6的设备就不能运行。 所以,一般debug的时候可以选择设置为yes,release的时候要改为no,以适应不同设备。
VALID_ARCHS: ios32: armv7,armv7s ;ios64: arm64
Space-separated list of identifiers. Specifies the architectures for which the binary may be built. During the build, this list is intersected with the value of ARCHS build setting; the resulting list specifies the architectures the binary can run on. If
the resulting architecture list is empty, the target generates no binary.
关于Architectures和VALID_ARCHS的选择,更多可参考:
https://blog.csdn.net/lizhongfu2013/article/details/42387311
注意事项:ios平台打包所有平台静态库(lib_universal.a)的方法:
makefile脚本如下:
all:
test -d ../bin/tmp || mkdir ../bin/tmp
#armv7
make -C ./dec_lib PLATFORM=ios32
cp ../lib/ios32/lib_test.a ../bin/tmp/lib_test_ios32.a
#arm64
make -C ./dec_lib PLATFORM=ios64
cp ../lib/ios64/lib_test.a ../bin/tmp/lib_test_ios64.a
#i386
make -C ./dec_lib PLATFORM=ios_i386
cp ../lib/ios_i386/lib_test.a ../bin/tmp/lib_test_ios_i386.a
#x86_64
make -C ./dec_lib PLATFORM=ios_x86_64
cp ../lib/ios_x86_64/lib_test.a ../bin/tmp/lib_test_ios_x86_64.a
libpo -create ../bin/tmp/* -output ../lib/libtest_univesal.a
rm -rf ../bin/tmp
(3)添加demo文件(main.c,头文件)。将demo文件和库文件拷贝到刚刚建立的xcode工程下面,在工程名上右键–>add files to xxx—>选择需要添加的文件完成文件添加。
(4)工程设置。点击工程名—>build settings—>code signing–>设置code signing identity中的项目(debug/release)。
(5)添加静态库文件。点击工程名—>build phases—>link binary with libraries—>将需要添加的库加进来。
(6)添加资源文件。点击工程名—>build phases—->copy bundle resourses—>将需要的资源文件添加进来。
(7)读取码流文件。点击itools工具—>选择新建的app名字—->点击文件夹符号—->documents—->导入—–>选中需要导入的测试码流。需要注意读取码流文件时的路径应该也是手机中documnent目录。
(8)在app控件初始化函数中添加代码。在主函数中需添加在ViewController.m的viewDidLoad函数中,作为一个普通函数调用:
例如:
int main_test(int argc, char *argv[], char *pin, char *pout); //函数声明
-(void) viewDidLoad{
[super viewDidLoad];
NSArray* array = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);//当前报的域指向对应手机中的文件指针
NSString* strDocument = [array objectAtIndex:0];
NSString* outfilePath = [strDocument stringByAppendingPathComponent:@"test_out.yuv"];//输出路径需要在手机相应的document下!
NSLog(@"output path is %@",outfilePath); //用于打印数据
NSString* InputfilePath = [[NSBundle mainBundle] pathForResource:@"svac2"];//输入文件可以直接使用包的路径,这样,码流文件放在包(工程)中即可。
NSLog(@"input mainBudle path is %@",InputfilePath);
main_test(0,NULL,[InputfilePath UTF8String],[outputtfilePath UTF8String]);//demo文件传入相应参数
}
说明:将我们自己的库demo加入到xcode工程中的方法的进一步说明:
测试描述:新建一个简单的app工程,将原来我们自己的库demo添加到app中测试,可以将main_test()函数添加到app控件初始化函数下(需要将demo文件中的main函数修改为main_test函数名),这样控件初始化的时候,就可以执行main_test()函数。
(9)从手机中获取xcode工程生成的yuv文件或者log文件:
a. 在launchpad中找到iTools;
b. 在应用中找到进行解码的xcode工程名称,比如test_demo,然后选中工程右键选择文档;然后点击所需要的文件导出即可。
(10)一个xcode工程既可以运行arm_ios32汇编,也可以运行arm_ios64汇编,需要选中TARGETS进行相应修改:
a. 在工程设置Build_settings下Architectures—-ONLY_ACTIVE_ARCH设为Yes;
b. 在工程设置Build_settings下Architectures—-VALID_ARCHS中
ios32: armv7
ios64: arm64
2.3 测试环境:
mac(xcode6.1环境)+iphone SE
ios 32位测试机:iphone 5c (苹果A6(Cortex-A7处理器),32位双核处理器,1G运行内存,架构:armv7s)
ios 64位测试机: iphone 6s (苹果A9,64位双核处理器,2G运行内存,架构:arm64)
2.4 运行:
- 用数据线连接苹果手机
- 点击xcode中的运行按钮或者Fn+F6,即可完成编译和运行。
- 生成的yuv文件或者log文件在手机的document目录下面。
- 在使用xcode IDE过程中,可以设置断点进行单步调试或者采用NSLog函数打印相关信息。
2.5 补充知识:
ios/mac相关编译器、系统库和头文件的选择及其路径:
1、编译器路径:
无论是对于ios还是ios simulator都是这个路径:
/Applications/Xcode6.4.app/Contents/Developer/ToolChains/XcodeDefault.xctoolchain/usr/bin/clang
2、系统库和头文件路径:
在路径/Applications/Xcode.app/Contents/Developer/Platforms下面
3、查看编译器或工具的路径:
xcrun -sdk iphonesimulator -find
xcrun -sdk iphoneos -find
xcrun -sdk macos -find clang
THE END!
本博文只能阅读,谢绝转载,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 2963033731@qq.com