如何将一个UNIX命令行程序(Berkeleys SPICE)编译成可用的库以在iOS应用中使用?

11
我正在尝试在iOS应用程序中使用伯克利的SPICE工具,但是在编译iOS版本时遇到了问题。
这是一个命令行程序,我可以像在终端中一样调用它:
./spice3f5 <arguments>

这个功能很好用,我希望在我的iOS应用程序中也能使用,但我不认为我可以只是将可执行文件复制到Xcode并从Swift中调用它。

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

  • 有一个更新的SPICE版本叫做ngspice,它相对较新(2014年发布)
  • 我相当确定有一些应用程序使用了SPICE或ngspice,所以我肯定可以通过某种方式实现它。
  • 我读过一篇关于一个人说ngspice已编译为共享库(ctrl+f“ngspice”),他用它制作了一个应用程序。我已经给他发了电子邮件,但他不幸没有回复。
我在这里询问的原因是当我搜索“ngspice iOS”时,我发现 this thread 这个帖子,里面有很多聪明的人试图编译一个静态库,这似乎超出了我的能力范围。我了解到从iOS8开始允许使用动态库。那么编译*.dylib是否比编译静态库更容易呢?
我该如何在iOS应用程序中使用ngspice或SPICE?
谢谢

由于您使用的是移动/联网设备,因此可以在服务器端运行计算并仅在设备本身上使用UI。这种方法具有更多的计算能力、用户存储、多设备访问以及其他与服务器端解决方案相关的优点。 - transistor
是的,那绝对是一种选择,而且那就是我目前正在使用的方式,但最大的劣势在于它可能需要几秒钟的时间,这就是为什么我试图尝试本地完成所有操作。 - A_toaster
这可能需要理解 SPICE 源代码才能完成。通常将命令行程序的功能作为库使用是不容易的。 - Pedro Castilho
@PedroCastilho 哦,好的,我原本以为可能有一种相对简单的方法可以做到这一点,因为我可以在OSX上运行可执行文件而不需要任何依赖项。无论如何,谢谢。 - A_toaster
@AndreLDM 是的,我已经查看了手册并尝试在Mac OS下编译它,但是在运行“make”命令时似乎遇到了bison问题。它说有一堆语法错误,我认为这意味着需要在此平台上进行重构。@SamuelTulach 我想出于某种原因,我认为在Swift中将其用作库会更容易,这样我就不必桥接它了。我的想法是UNIX可执行文件可以通过某种方式进行调整,以使其能够构建为iOS兼容库,尽管我现在意识到这不是问题! - A_toaster
显示剩余2条评论
1个回答

1
静态库和动态库的区别在于它们所在的位置。静态库位于应用程序的二进制文件内,而动态库则位于运行应用程序的系统(iPhone)上。难度方面没有太大区别。例如,在OS X上使用动态库时,您可能需要先在另一个项目中编译一个 .dylib 文件。然后将新的 .dylib 文件复制到 /usr/lib 或类似路径的位置,该位置是系统路径的一部分。接下来,您需要将知道如何与新的 .dylib 文件通信的相关头文件复制到 /usr/include 文件夹中。此时,您可以在 xcode 中使用尖括号导入所述头文件,如下所示:
#import <my_dylib_header_file.h>

在静态世界中,您只需将.dylib文件拖入Xcode,然后将相关的头文件复制到源文件夹中,然后使用引号导入,如下所示:
#import "my_dylib_header_file.h"

静态导入的优点是库被嵌入最终产品中,而动态链接需要在二进制文件能够正常运行之前安装dylib(类似于Windows上的DLL)。静态导入的缺点是最终二进制文件较大,因为它包含更多的代码。
动态导入的优点是二进制文件较小,并且可以更新dylib而无需更新二进制本身。
但是基于您的问题,我认为这些都与您的项目无关。您有源代码。这意味着对于您的目的来说,创建dylib是完全不必要的,您可以像将其添加到xcode项目一样处理源代码,就像静态库一样。如果我是您,我会将Spice源代码添加到我的xcode项目中,并忘记创建dylib。从那里,我会从Swift导入文件并调用它们。有很多线程解释如何从Swift调用C函数或Objective-C类,所以我不会在这里详细说明,而是引用另一个答案: Swift:如何从dylib加载C函数

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接