您可以为iOS构建动态库并在运行时加载它们吗?

时间:2011-01-19 09:56:40

标签: ios xcode dylib

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

在Xcode中,我尝试创建新项目 - > 框架&图书馆 - > Cocoa Library(动态)。在项目设置中,我将 Base SDK 设置为iOS device 4.1并定位到iOS4.1,但它有一个构建错误:

  

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

我选择的版本是模拟器 - >调试 - > I386

3 个答案:

答案 0 :(得分:156)

我并不是真的不同意DarkDust's answer,但如果我可以引导我内心的比尔克林顿,it depends on what the meaning of supported is:)

Apple不希望您为App Store应用程序执行此操作,但操作系统当然允许它。越狱应用程序一直使用这种技术。您基本上使用标准的UNIX技术来动态打开框架/库,然后使用其中的东西。 dlopen function允许您通过传递the path to that framework或dylib来打开库。从某些docs for building jailbreak apps开始,这是一个调用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文件来覆盖的内容:

Build and use dylib on iOS

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

因此,这不是技术限制,而是App Store政策限制。如果您不仅限于App Store,那么您可以这样做。请注意,此技术需要越狱,但如果应用程序是沙盒,则可能会限制可以从中加载 dylibs。

编辑,为了确保此信息不会丢失到以后的链接腐败,这里是我提供的关于如何在Xcode中启用iOS dylib的链接的内容。 (注意:此过程仍适用于Xcode 4,但请参阅下面的评论以了解路径更新等。)来源是iOS Place blog


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 Simulator ProductTypes.xcspec

2. 找到产品类型为com.apple.product-type.library.dynamic的“ MacOSX Product Types.xcspec ”中的项目并将其拖到“ iPhone模拟器ProductTypes.xcspec “。

Xcode screenshot 1

3。在相同位置打开“ MacOSX Package Types.xcspec ”和“ iPhone模拟器PackageTypes.xcspec ”。

4. 找到包含类型为com.apple.package-type.mach-o-dylib的“ MacOSX Product Types.xcspec ”中的项目并将其拖到“ iPhone模拟器PackageTypes.xcspec “。

Xcode screenshot 2

5. 重复“ iPhoneOS.platform ”的步骤,如果正在运行则重新启动Xcode。

现在,让我们构建一个dylib。从“ Cocoa Touch静态库”模板开始。这应该包括项目中的Foundation.framework。以下是我在模板顶部进行的更改以构建dylib。

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

现在,使用Xcode打开项目,转到项目 - >编辑项目设置

2。安装目录”设置为@executable_path/因为我打算将dylib放在与应用程序可执行文件相同的目录中。

3。 Mach-O类型”设置为动态库

4. 可执行扩展程序”设置为dylib

5. 可执行文件前缀”设置为空

6. :向库中添加一个或两个简单方法并构建它。

现在,创建一个应用程序来测试它。这一次,我选择基于视图的应用程序。连接UIButton和UILabel以调用lib并显示返回消息。您可以download the complete project TestApp使用它。

答案 1 :(得分:101)

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

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

答案 2 :(得分:0)

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