我想在iOS应用程序中使用UNIX命令行程序(Berkeleys SPICE).将它编译成可用库的过程是什么?

A_t*_*ter 11 compilation dylib static-libraries ios

我试图在iOS应用程序中使用Berkeley的SPICE工具,但是在编译iOS时遇到了问题.

这是一个命令行程序,我可以从终端调用,如:

./spice3f5 <arguments>
Run Code Online (Sandbox Code Playgroud)

哪个效果很好,我想在我的iOS应用程序中使用此功能,但我认为我不能将可执行文件复制到Xcode并从Swift调用它.

我做了一些研究,发现了以下内容:

  • SPICE的更新版本名为ngspice,相对较新(2014年发布)
  • 我很确定那里有应用程序,而不是使用SPICE或ngspice,所以我确信它可以以某种方式完成.
  • 我读过一篇关于一个人说ngspice被编译为共享库(ctrl + f"ngspice")的文章,他用它制作了一个应用程序.我已经给他发了电子邮件,但遗憾的是他还没回复.

我在这里问的原因是因为在搜索"ngspice iOS"时,我遇到了这个线程,其中有很多聪明的人试图编译静态库,这似乎超出了我的范围.我了解到iOS8允许动态库.那么编译*.dylib会比静态库更容易吗?

我如何在iOS应用程序中使用ngspice或SPICE?

谢谢

den*_*ter 1

静态库和动态库之间的区别本质上在于它们所在的位置,静态库将驻留在应用程序的二进制文件中,而动态库将驻留在运行应用程序的系统(iPhone)上。就难度而言,没有太大区别。例如,如果您想在 os x 上采用动态路线,您可以首先在单独的项目中编译 .dylib 文件。然后将新的 .dylib 文件复制到 /usr/lib 或属于系统路径一部分的类似位置。然后,您需要将知道如何与新的 .dylib 文件通信的关联头文件复制到 /usr/include 文件夹中。此时,您可以使用尖括号在 xcode 中导入所述头文件,如下所示:

#import <my_dylib_header_file.h>
Run Code Online (Sandbox Code Playgroud)

然而,在静态世界中,您只需将 .dylib 文件拖到 xcode 中,然后将关联的头文件复制到源文件夹中,然后使用引号导入,如下所示:

#import "my_dylib_header_file.h"
Run Code Online (Sandbox Code Playgroud)

静态导入的优点是库会融入到最终产品中,而不是动态链接,动态链接需要在二进制文件能够正常运行之前将 dylib 安装在系统上(想想 Windows 上的 DLL) )。静态导入的缺点是最终的二进制文件更大,因为它包含更多代码。

动态导入的优点是二进制文件更小,并且可以更新 dylib 而无需更新二进制文件本身。

然而,根据您的问题,我认为这些对您的项目都不重要。你有源代码。这意味着创建 dylib 对于您的目的来说完全没有必要,您只需将源代码添加到您的 xcode 项目中即可将源代码视为静态库。如果我是你,我会将 Spice 源代码添加到我的 xcode 项目中,而忘记创建 dylib。从那里我将导入文件并从 swift 调用它们。有很多线程解释了如何从 swift 调用 c 函数或 Objective-C 类,所以我不会在这里深入讨论,相反,我将向您推荐另一个答案:Swift: How to call a C function returned from a dylib