如何为iOS创建Rust动态库(dylib)?

3
rust工具链目前不允许在aarch64-apple-ios目标上创建动态库crate类型(cdylib或dylib)。
互联网上的观点是,苹果在上传应用到App Store时不允许动态库。
然而,我在TN2425中看到的是,只要将动态库嵌入应用程序作为框架,就可以使用动态库。技术说明描述了如何从动态库创建框架。
我的用例是,我正在构建一个Rust库,它对由苹果提供的Objc系统库进行了多次调用。如果我创建一个静态库,Cargo/Rust会链接所有SDK,并给我一个非常大的静态库,与特定的SDK发布绑定。
有没有办法我可以手动从Rust工具链生成的中间文件中创建动态库?然后我可以签名并将其嵌入我的iOS应用程序。

当你说“链接所有SDK”时,你是指iOS系统库吗?因为这是不可能的,因为在iOS SDK中没有静态库。 - Siguza
2
我开始感到非常愚蠢。我的dylib版本是3,051,444字节(约3Mb),我的静态版本是20,281,120字节(约19Mb)。我假设这是因为链接SDK。然而,后来我发现了otoolsize。额外的大小是由于Rust运行时,我认为这是必需的。 - Thomas O'Dell
Bhargav Rao,您能否恢复我的隐藏答案?我已经更新了它以反映我在调查过程中学到的内容,并仍然认为这是对所提出问题的正确回答,即:这就是你应该这样做,顺便说一句,这对你没有任何好处。 - Thomas O'Dell
2个回答

1
根据 Rust Issue #73516,aarch64-apple-ios 的夜间工具链已经提供了 iOS 的动态链接。然而,这对你并没有太大好处。静态库中的额外大小来自 Rust 运行时,你需要它们。你可以查看嵌入式 Rust 和 Rust WASM 程序员是如何缩小运行时部分的。

-3

iOS只需要制作一个静态库(苹果不允许iOS上的第三方动态库),所以幸运的是,您不需要任何苹果专有的框架进行链接。

如果您没有任何对C库的依赖,那么应该会更容易,因为Rust本身知道如何进行交叉编译。


感谢您的评论。然而,问题明确说明了为什么解决方案需要访问专有框架。我发现如果我引用其中一个框架,Rust会将其包含在静态库中。 - Thomas O'Dell

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