.m ios 文件编译之后

2019-01-11 11:47:40 feelinghappy 阅读数 2170
  • 组件基础2

    掌握Vue.js基础知识; 掌握Vue.js核心功能; 掌握Vue.js实战技能;

    0人学习 刘宏强
    免费试看

1. .m文件是纯Object-C 文件

.mm是Object-C和C++混合文件

 

2. .m只能调用纯Object-C的类,不能调用混合的

.mm可以调用Object-C的,也可以调用C++的

 

3. .m要调用混合的怎么办?

可以

解决办法是.h用Object-C的方式,而具体实现用.mm的方式

2016-11-17 19:35:54 cjh965063777 阅读数 7167
  • 组件基础2

    掌握Vue.js基础知识; 掌握Vue.js核心功能; 掌握Vue.js实战技能;

    0人学习 刘宏强
    免费试看

现在仅讨论代码层面的反编译

1、反编译工具

(1)class-dump

主要用来反编译一个库文件或者app的方法名、属性等声明(即.h文件,强大的是反编译出来的.h不仅仅包含头文件中的声明,.m中的function方法名称也同样能够反编译出来)。class-dump的安装在前文中有详细描述,这里不再赘述。

(2)IDA

主要用来反编译库文件的实现(当然方法声明同样能够反编译出来,用class-dump主要是更加形象,有针对性),这个反编译工具非常强大能够将函数的实现及逻辑关系、流程统统显示出来,弊端就是反编译出来的内容为汇编语言,需要一定汇编基础的才能看懂。比较头疼。

(3)Hopper Disassembler

与IDA功能相似,主要功能都是反编译查看方法的实现,这个软件的功能相对于IDA来说,可读性要强很多,反编译出来的内容类似于汇编与OC的运行时的结合体,相对比较容易看出方法的具体实现。

笔者个人比较喜欢用1和3来完成反编译过程。

各个软件的下载地址:

(1)class-dump  

http://stevenygard.com/projects/class-dump

(2) IDA   

https://www.hex-rays.com/products/ida/support/download_demo.shtml

(3)Hopper

https://www.hopperapp.com/download.html?

2019-05-05 20:29:06 shifang07 阅读数 1037
  • 组件基础2

    掌握Vue.js基础知识; 掌握Vue.js核心功能; 掌握Vue.js实战技能;

    0人学习 刘宏强
    免费试看

之前合成了静态库.a, 有时候我们会拿到别人提供的静态库,但是编译报错,这时候最先要考虑的一步就是这个静态库是否支持我们编译的架构。怎么查看支持的架构?废话不多说!下面亲自实验一下

第一步:

准备一个静态库.a文件,比如我们之前制作的 libVideoPlayerLib.a,放在桌面的test目录里。
在这里插入图片描述

第二步:

  1. 打开终端:cd 到 libVideoPlayerLib.a 所在的文件夹test下 .
  2. 查看 libVideoPlayerLib.a 包含几种架构 arch 。 (file 命令)
  3. 分离出一种架构的.a。(lipo **.a -thin armv7 -output armv7.a)
  4. 抽离.a文件的object文件.o。(ar -x armv7.a)
  5. 将.o 转换为 .m。(nm ****.o > ****.m)
Last login: Sun May  5 19:30:20 on ttys004
lzz-Mac-mini:~ suning$ cd /Users/suning/Desktop/test 
lzz-Mac-mini:test suning$ file /Users/suning/Desktop/test/libVideoPlayerLib.a 
/Users/suning/Desktop/test/libVideoPlayerLib.a: Mach-O universal binary with 4 architectures: [arm_v7:current ar archive random library] [arm64:current ar archive random library]
/Users/suning/Desktop/test/libVideoPlayerLib.a (for architecture armv7):	current ar archive random library
/Users/suning/Desktop/test/libVideoPlayerLib.a (for architecture i386):	current ar archive random library
/Users/suning/Desktop/test/libVideoPlayerLib.a (for architecture x86_64):	current ar archive random library
/Users/suning/Desktop/test/libVideoPlayerLib.a (for architecture arm64):	current ar archive random library
lzz-Mac-mini:test suning$ lipo libVideoPlayerLib.a -thin armv7 -output armv7.a
lzz-Mac-mini:test suning$ ar -x armv7.a
lzz-Mac-mini:test suning$ nm VideoPlayerLib.o > VideoPlayerLib.m

在这里插入图片描述6. 打开导出到.m 伪代码
在这里插入图片描述通过伪代码可以了解.m 的实现过程

2017-06-01 16:52:06 abvedu 阅读数 1797
  • 组件基础2

    掌握Vue.js基础知识; 掌握Vue.js核心功能; 掌握Vue.js实战技能;

    0人学习 刘宏强
    免费试看



Objective-c语言有.h .m文件组成。静态库可以将 .m文件封装成一个.a文件,第三方应用程序只需要拿到这个.a文件和代码对应的.h文件即可使用静态库中封装的方法。IOS静态库适合去制作第三方提供的SDK


.a文件与 iOS静态库


首先看静态库和动态库的区别:


在实际的编程过程中,通常会把一些公用函数打包成函数库,供其它程序调用,不但提高了代码的复用;而且还保护了核心技术。所以在实际的项目开发中,经常会使用到函数库,函数库又分为静态库和动态库两种。

和多数人所熟悉的动态语言和静态语言一样,这里的所谓静态和动态是相对编译期和运行期的:静态库在程序编译时会被链接到目标代码中,程序运行时将不再需要改静态库;而动态库在程序编译时并不会被链接到目标代码中,只是在程序运行时才被载入,因为在程序运行期间还需要动态库的存在。

iPhone平台来说,iPhone官方只支持静态库联编。


iOS静态库的使用


1、创建静态库

打开XCode新建一个项目,选择Library下的“Cocoa Touch Static Library”,在Classes文件夹上点右键选择“New File…”,然后在“Cocoa Touch Class”下选择“Objective-C class”,这样就可以创建Objective-C风格的源文件和头文件。

同样,也可以创建C或者C++风格的代码,在Classes文件夹上点右键,选择“New File…”,这次选择Mac OS X下的“C and C++”,就行。

然后在文件里编写具体的调用代码。

最后进行编译,就会产生一个以.a为结尾的文件,就是我们需要的静态库。同时我们也需要生成的.h头文件。


2、使用静态库

在需要调用静态库的工程的目录下通过右键点Frameworks->Add->Existing Files..添加之前创建的.a静态库文件,然后在需要调用静态库的函数的.h文件里,import进来和静态库中.m对应的.h头文件,并且声明静态库里的类:@class类名,这样就可以使用静态库里的函数了。


3、联调静态库

如果单单以copy的方式包含进.a静态库,这样只能使用静态库,如果需要修改静态库里的函数,则需重新生成静态库,并将其重新包含进来,在开发阶段会显得比较麻烦。可以采用XcodeCross-Project Reference(跨项目参考)的方式解决。

首先把静态库的XCode项目整个包含进我们的当前项目(注意:不要选择Copy items to destination group's folder选项)。

接着和第二步一样也是包含进.a静态库(也要注意:不要选择Copy items to destination group's folder选项)。

这样就可以从我们当前的项目里直接打开静态库的项目,直接修改(注意:修改后编译前必须选择clean,清除原有的静态库,重新生成)。现在发现一个简单的调用静态库的方法

framework右键点击add-->ExistingFramework-->add other浏览静态库(.a)文件添加进来,就可以使用。

2018-10-12 17:27:04 u013983033 阅读数 2073
  • 组件基础2

    掌握Vue.js基础知识; 掌握Vue.js核心功能; 掌握Vue.js实战技能;

    0人学习 刘宏强
    免费试看

现在再有一个功能,不知道是集成方是想用.a 还是framework 就将两种都给实现了 ,这篇介绍.a文件的生产, framework生产

生产.a库

1.首先创建一个新的工程,选择ios --》Framework&Library --》 Cocoa Touch Static Library 工程名例如 DemoA
选择如图
项目命名

2 之后我们会看到自动生成.h和.m文件 可以在.m文件中写你要的代码 或者新建.h和.m文件,将自动生成的删除了
在这里插入图片描述
3 咱们就再自动生成的文件中进行操作了
.h 文件在这里插入图片描述
.m 文件
在这里插入图片描述
4.选择需要公开的头文件

在这里插入图片描述
5 静态库需要支持的版本
在这里插入图片描述
6 修改配置 Active Architecture Only修改为NO,否则生成的静态库就只支持当前选择设备的架构。
在这里插入图片描述
7 接下来就是编译生成.a文件了
1)真机编译的.a 文件 选中真机编译,对应生产一个真机的.a 文件
在这里插入图片描述
选择Generic iOS Device,command+b完成后,在工程的Products文件夹下的.a文件从红色编程了黑色。编译成功,然后Show in Finder。
在这里插入图片描述
下图是真机.a
在这里插入图片描述

2)模拟器编译的.a 文件 选中模拟器编译,对应生产一个模拟器的.a 文件
在这里插入图片描述
command+b完成后,在工程的Products文件夹下的.a文件从红色编程了黑色。编译成功,然后Show in Finder。对应的模拟器的.a文件
在这里插入图片描述
在这里插入图片描述
8 用命令lipo -info 静态库名字来查看,是支持真机还是模拟器
模拟器查看
如图 Debug-iphonesimulator里面支持i386、x86_64,属于模拟器,用到真机会报错

在这里插入图片描述
Debug-iphoneos里面支持armv7、arm64,属于真机,用到模拟器就会报错
9 合并静态库-让模拟器和真机使用一个静态库
命令如下:
lipo -create 第一个.a文件的绝对路径 第二个.a文件的绝对路径 -output 最终的.a文件路径
在这里插入图片描述
这个生成的.a文件,就是支持真机和模拟器的静态库了。创建一个文件夹,把.a和头文件拖进去,这个文件夹就是我们所需要的。一般上线的时候只导入真机的,这样工程的体积也会小一些。

在这里插入图片描述

如何使用静态库呢
新建一个工程,把我们的静态库拖进去,导入头文件。
在这里插入图片描述
在这里插入图片描述
运行效果
在这里插入图片描述
注意 如果静态库中有Category类,就要在使用静态库项目的配置中添加-ObjC或者-all_load

如果有错误的地方欢迎指出,一起学习,一起进步。