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

标签 ios compilation static-libraries dylib

我正在尝试使用 Berkeley's SPICE iOS 应用程序中的工具,但在为 iOS 编译它时遇到问题。

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

./spice3f5 <arguments>

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

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

  • 有一个名为 ngspice 的 SPICE 更新版本,这是相对较新的(2014 年发布)
  • 我相当确定有一些应用程序没有使用 SPICE 或 ngspice,所以我确定它可以以某种方式完成。
  • 我读过一篇关于一个人的文章ngspice has been compiled as a shared library (ctrl+f "ngspice"),他用它制作了一个应用程序。我已经给他发了电子邮件,但不幸的是他没有回复。

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

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

谢谢

最佳答案

静态库和动态库之间的区别本质上在于它们所在的位置,静态库位于应用程序的二进制文件中,而动态库位于运行应用程序的系统 (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: How to call a C function loaded from a dylib

关于ios - 我想在 iOS 应用程序中使用 UNIX 命令行程序 (Berkeleys SPICE)。将其编译成可用库的过程是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42779779/

相关文章:

ios - 防止 UINavigationBar 的 TitleView 动画

ios - 集合枚举按顺序搜索字符串

compilation - 如何控制cmake的子目录编译顺序?

java - JVM 是否使用 kotlinc 来实现 Kotlin?

ios - 使用 Xcode 中现有的 C 代码为 iOS 创建静态库

ios - 更新后应用程序启动弹出警报 View

javascript - 如何使 'clickable' 元素在 iOS 触摸设备上具有可选文本?

c - 像 gcc 这样的 C 编译器是否足够智能,可以进行位移位?

c++ - 如何使用 libtensorflow-core.a 构建静态库以及如何使用它?

ios - 如何在 iOS 中包含两个几乎相同的静态库