首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >您能为iOS构建动态库并在运行时加载它们吗?

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

Stack Overflow用户
提问于 2011-01-19 09:56:39
回答 3查看 97.7K关注 0票数 118

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

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

target指定产品类型‘com.apple.Product- type .platform.Dynamic’,但是没有“iphone仿真器”平台的产品类型。

我选择的构建是模拟器-> Debug -> i386

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-19 10:00:08

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

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

票数 111
EN

Stack Overflow用户

发布于 2012-05-09 03:29:16

我并不是真的不同意黑暗尘埃的答案的观点,但请允许我引导我内心的比尔·克林顿, :)

苹果不希望你为Apple应用程序这么做,但操作系统肯定允许你这么做。越狱应用程序一直在使用这种技术。您基本上使用标准的UNIX技术动态地打开一个框架/库,然后在其中使用一些东西。dlopen函数允许您通过传入通向这一框架的道路或dylib打开库。从某些创建越狱应用程序的文档中,有一个调用在您自己的独立dylib中实现的init()函数的示例:

代码语言:javascript
运行
复制
#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策略限制。如果您不局限于App,那么您可以这样做。请注意,这种技术不需要而不是需要越狱,尽管如果应用程序是沙箱的,它可能会限制从何处加载dylib。

编辑:为了确保这些信息不会丢失在未来的链接中,下面是我提供的关于如何在Xcode中启用iOS dylib的链接的内容。(注意:这个过程仍然适用于Xcode 4,但有关路径的更新,请参见下面的注释)源是iOS场所博客

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

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

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

3. Open“MacOSX Package Types.xcspec”和“iPhone Simulator PackageTypes.xcspec”在同一地点找到。

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

“iPhoneOS.platform”5. 5.对X代码重复执行步骤,并在运行时重新启动Xcode。

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

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

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

2.“Installation directory ”设置为@executable_path/,因为我计划将dylib与应用程序的可执行文件放在同一个目录中。

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

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

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

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

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

丢失的知识:下面的屏幕截图与现在不起作用的链接有关。在iOS上构建和使用dylib

票数 165
EN

Stack Overflow用户

发布于 2020-04-21 20:57:55

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4733847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档