5

先感谢您。我有一个static library,比如说 libpics.a。我想看看它的内容,比如那个库的代码。我的静态库有一个.h file和一个.a file,我可以看到 的内容.h file,只有一种方法,但是我看不到.a file. 经过一番搜索,我可以找到它,.a file包含方法的编码部分或实现.h file's。我是iOS开发新手,其中的代码.a file,我想提取它并使用它。

我尝试搜索如何打开静态库,但大多数时候我都在搜索与如何创建静态库以及如何使用它等相关的搜索。但我只想打开静态库文件,只想查看它的实现中的代码文件。

我读了一些关于nmar工具的东西,但我不明白在哪里应用该代码。

像这样的东西

nm -C libschnoeck.a | less

或者

ar -t libsamplerate.a

安装命令行工具后,我 根据Владимир Водолазкий 的建议在终端中编写了
ar -x phpFramework.a代码。
我得到了以下线..

ar: phpFramework.a is a fat file (use libtool(1) or lipo(1) and ar(1) on it)
ar: phpFramework.a: Inappropriate file type or format
4

2 回答 2

8

您看不到静态库中的源代码,只是因为那里没有源代码。IOS 中的静态库与任何其他类 Unix 系统一样,包含一组已编译的过程/函数/方法。

在构建普通项目时,只需仔细查看 Xcode 日志即可。你可以发现,首先,*.m 文件被编译成 *.o 格式——它实际上是二进制格式(在编译源文件用于模拟器或本机设备时是不同的)。然后将这些 *.o 文件链接到应用程序。(请不要责怪我这个简单的解释%-))

事实上,静态库只是一组这样的预编译 *.o 文件。它由开发人员/所有者提供,以节省您的编译时间或/和保护源代码不被修改。因此,您只能在外部调用的帮助下使用它,这些调用记录在.h 文件中,或者您可以从那里提取单独的模块 (.o) 并将其“手动”链接到您的应用程序中。

于 2013-11-07T11:15:02.990 回答
2

用于创建库的代码被编译成链接到 .a 文件的目标文件。.a 文件不包含代码,您无法从 .a 文件中获取可读代码。

但是,要使用该库,您不需要代码,只需按照Xcode 文档将库包含在您的 Xcode 项目中,并将标头#import 到您的代码中,以便编译器知道库中的内容。

在项目的链接阶段,链接器将查看从您的代码生成的目标代码并找到未解析的符号,然后它将在库中查找这些符号,并且只从库中提取需要的对象。(静态库优于动态库的一个好处)

nm 将列出已在库中定义并且您的代码可以调用的符号。

于 2013-11-07T11:16:53.383 回答