117

iOS (iPhone/iPad) 是否支持动态库?

在 Xcode 中,我尝试创建一个New project -> Framework & Library -> Cocoa Library (dynamic)。在项目设置中,我将Base SDKiOS device 4.1和 target 设置为,iOS4.1但它有一个构建错误:

目标指定产品类型“com.apple.product-type.library.dynamic”,但“iphonesimulator”平台没有这样的产品类型”。

我选择的构建是Simulator -> Debug -> i386

4

3 回答 3

165

我并不是真的不同意DarkDust 的回答,但如果我可以引导我内心的比尔克林顿,这取决于支持的含义是什么:)

Apple 不希望您为 App Store 应用程序这样做,但操作系统肯定允许这样做。越狱应用程序一直使用这种技术。您基本上使用标准 UNIX 技术来动态打开框架/库,然后使用其中的内容。dlopen 函数允许您通过传入该框架或 dylib的路径来打开库。从一些用于构建越狱应用程序的文档中,这是一个调用init()在您自己的单独 dylib 中实现的函数的示例:

#include <dlfcn.h>

initWrapper() {
    char *dylibPath = "/Applications/myapp.app/mydylib2.dylib";

    void *libHandle = dlopen(dylibPath, RTLD_NOW);
    if (libHandle != NULL) {
        // This assumes your dylib’s init function is called init, 
        //    if not change the name in "".
        void (*init)() = dlsym(libHandle, "init");
        if (init != NULL)  {
            init();
        }
        dlclose(libHandle);
    }
}

此外,允许您为 iOS构建动态库项目的默认限制是 Xcode 中的某些内容,您可以通过编辑一些 XCode xml 文件来覆盖它:

在 iOS 上构建和使用 dylib

完成此操作后,您可以构建一个普通的 iOS .dylib库,并按照上面的示例代码使用它。(是的,每当您安装新的 XCode 版本时,您可能必须再次解锁此功能)。

因此,这不是技术限制,而是 App Store 政策限制。如果您不限于 App Store,那么您可以做到。请注意,这种技术不需要越狱,尽管如果应用程序是沙盒的,它可能会限制可以从哪里加载 dylib。

编辑:为了确保这些信息不会因未来的链接失效而丢失,这里是我提供的关于如何在 Xcode 中启用 iOS dylib 的链接内容。(注意:这个过程仍然适用于 Xcode 4,但请参阅下面的评论以获取路径等的更新。)来源是iOS Place 博客


Xcode 不允许您为 iOS 构建 dylib。如果应用程序不是单个二进制文件,它将被拒绝。但是我有一个具有插件架构的应用程序来加载可选模块。我只想要一个快速原型来证明概念,然后再将其完全移植到 iOS。如果 dylib 可以简单地工作,这样做会更快。因此,这篇文章展示了如何构建和使用 dylib,但请注意它不会被 App Store 批准。(在 10.6.4 上使用 Xcode 3.2.4 测试)

1.在属性列表编辑器中打开这些文件:/Developer/Platforms/MacOSX.platform/Developer/Library/Xcode/Specifications/MacOSX Product Types.xcspec/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Specifications /iPhone 模拟器 ProductTypes.xcspec

2.在“<strong>MacOSX Product Types.xcspec”中找到产品类型的条目,com.apple.product-type.library.dynamic将其拖到“<strong>iPhone Simulator ProductTypes.xcspec”中。

Xcode截图1

3.打开在相同位置找到的“<strong>MacOSX Package Types.xcspec”和“<strong>iPhone Simulator PackageTypes.xcspec”。

4.在“<strong>MacOSX Product Types.xcspec”中找到有包类型的项com.apple.package-type.mach-o-dylib,将其拖到“<strong>iPhone Simulator PackageTypes.xcspec”中。

Xcode截图2

5.对“<strong>iPhoneOS.platform”重复这些步骤,如果 Xcode 正在运行,则重新启动它。

现在,让我们构建一个dylib。从“<strong>Cocoa Touch 静态库”模板开始。这应该包括项目中的 Foundation.framework。这是我在模板之上为构建 dylib 所做的更改。

1.在文本编辑器中打开文件project.pbxproj(在 Xcode 项目文件包中找到)。搜索字符串“<strong>producttype”,将其值更改为com.apple.product-type.library.dynamic

现在,使用 Xcode 打开项目,转到Project->Edit Project Settings

2. “<strong>Installation Directory” 设置为,@executable_path/因为我打算将dylib 与应用程序的可执行文件放在同一目录中。

3. “<strong>Mach-O Type”设置为动态库

4 .“<strong>Executable Extension”设置为dylib

5. “<strong>Executable Prefix”设置为空

6.在库中添加一两个简单的方法并构建它。

现在,创建一个应用程序来测试它。这一次,我选择了基于视图的应用程序。连接一个 UIButton 和一个 UILabel 来调用库并显示返回消息。您可以下载完整的项目 TestApp并使用它。

于 2012-05-09T03:29:16.550 回答
109

在提出这个问题时,iOS 不支持动态库,这将导致您的应用程序被拒绝。只允许使用静态库。

但是,在 iOS8 中,您可以使用动态库和框架。它应该“正常工作”

于 2011-01-19T10:00:08.987 回答
0

从 Xcode 11.4.1 开始,不允许使用动态库(您的项目不会针对所有目标进行编译)。使用 libs/frameworks 的新方法是来自 xcodebuild 的 create-xcframework。

于 2020-04-21T20:57:55.403 回答