16 个版本 (稳定版)
3.3.1 | 2024年5月27日 |
---|---|
3.3.0 | 2024年1月28日 |
3.2.0 | 2022年2月13日 |
3.1.1 | 2020年9月29日 |
0.1.0 | 2015年9月21日 |
#47 in Cargo 插件
2,332 每月下载量
34KB
579 行
cargo lipo

提供了一个 cargo lipo
子命令,用于自动创建可用于您的 iOS 应用的通用库。
维护状态
请考虑该项目已过时/被动维护。部分原因是我目前没有在进行任何 iOS 项目,部分原因是我认为使用 lipo
的替代方案可能更好。
可以在 Xcode 中使用特定于架构(和操作系统)的环境变量。在最后一次尝试中,操作系统特定的部分可以在 Xcode 项目编辑器中进行配置,但架构特定的部分需要手动编辑 project.pbxproj
文件,例如这样
"LIBRARY_SEARCH_PATHS[sdk=iphoneos*]" = ../path/to/target/debug/<...>;
"LIBRARY_SEARCH_PATHS[sdk=macosx11.1][arch=arm64]" = ../path/to/target/<...>;
"LIBRARY_SEARCH_PATHS[sdk=macosx11.1][arch=x86_64]" = ../path/to/target/<...>;
因此,我认为未来的 iOS 支持库应该主要提供以下两个功能
- 类似于当前
--xcode-integ
标志的类似功能。 - 可以执行
project.pbxproj
编辑的功能。
用法
无论您通常在哪里运行 cargo
,现在都可以运行 cargo lipo
或 cargo lipo --release
来创建iOS的通用库,该库可以在 $target/universal/{release|debug}/$lib_name.a
中找到。
请确保您的 Cargo.toml
中有一个库目标,其crate类型为 staticlib
[lib]
name = "..."
crate-type = ["staticlib"]
Xcode集成
cargo-lipo
可以轻松集成到Xcode中。对于XCode 13,以下是一个集成方案,假设您的 myproject
crate(包含静态库)是XCode项目目录的兄弟目录,并且您的构建库是 libmystatic.a
。
-
向您的 "Build Phases" 添加一个新的 "Run Script" 阶段。将其放置在 "Compile Sources" 之前。命名为 "build Rust static library"。使其在每次构建时运行(取消依赖分析),并指定输出文件为
$(PROJECT_DIR)/../target/universal/$(CONFIGURATION:lower)/libmystatic.a
。将以下内容添加到脚本中# The $PATH used by Xcode likely won't contain Cargo, fix that. # This assumes a default `rustup` setup. export PATH="$HOME/.cargo/bin:$PATH" # --xcode-integ determines --release and --targets from Xcode's env vars. # Depending your setup, specify the rustup toolchain explicitly. cargo lipo --xcode-integ --manifest-path ../myproject/Cargo.toml
-
手动运行 cargo lipo 来构建调试和发布版本,然后更新 "Link Binary with Libraries" 阶段
- 首先通过点击 +,选择 "Add Other...",并导航到
../myproject/target/universal/debug
来添加您的调试库,并选择您的库。 - 接下来,以类似的方式添加发布库。
- 在将两个库添加到XCode后,删除实际的静态库文件(而不是XCode项目中的引用)。是的,真的。如果不这样做,XCode不会认为它们需要重新构建,因此不会运行您的脚本。
- 首先通过点击 +,选择 "Add Other...",并导航到
-
接下来,回到您的 "Build Settings" 并添加一个 "Library Search Path" 为
$(PROJECT_DIR)../myproject/target/universal/$(CONFIGURATION:lower)
。这将提供调试和发布版本的正确搜索路径。 -
最后,添加第二个 "Run Script" 构建阶段,但将其放在底部(以便在构建完成后运行)。命名为 "delete Rust static libraries" 并使其在每次构建时运行。(虽然删除我们刚刚构建的库可能看起来有些不合逻辑,但它需要使Xcode的新构建系统在每次构建时都运行构建脚本。在只有两个目标平台(x86_64和arm64)的日子里,cargo lipo的输出将包含两者,并且不需要重新构建。但现在实际上有三个目标平台(x86_64、arm64和arm64-simulator),构建的库只能有一个arm64变体。每次更改目标平台时,都需要重新构建库,但Xcode无法检测到这一点,因为它查看的是修改日期而不是目标平台。因此,我们总是在链接后删除构建的库,以便在下次运行时强制使用正确的目标进行重建。)此阶段的内
容应类似于# Delete the built libraries that were just linked. # If this isn't done, XCode won't try to rebuild them # by running the build scripts, because it won't think # they are out of date. rm -fv ../myproject/target/universal/*/*.a
-
如果您计划在XCode应用程序中执行
Archive
构建,您还需要进入您的"构建设置"并将启用位码设置为否
。这是因为Rust使用与Xcode不同的LLVM,并且在应用程序中的XCodeArchive
构建过程中执行位码验证,这将在Rust库上失败,并显示类似于以下错误消息的信息:无效值 (生产者: 'LLVM13.0.0-rust-1.57.0-stable' 读取器: 'LLVM APPLE_1_1300.0.29.30_0') 对于 架构 arm64
关于XCode集成的最后一点说明:因为所有XCode构建都是“一次一个目标”,所以在为iOS构建时根本不需要使用cargo lipo
。例如,要查看直接调用cargo的Xcode产品,请参阅rust-on-ios
项目中的应用程序。
安装
使用cargo install cargo-lipo
安装cargo lipo
。应该总是可以使用最新的稳定Rust版本构建cargo lipo
。对于最低支持版本,请检查.travis.yml
。
您还需要一个可以编译iOS目标的rust编译器。如果您使用rustup,您只需做以下操作:
# 64 bit targets (real device & simulator):
rustup target add aarch64-apple-ios x86_64-apple-ios
# 32 bit targets (you probably don't need these):
rustup target add armv7-apple-ios i386-apple-ios
故障排除
Cargo失败并显示error: can't find crate for `std`
:您的rust编译器很可能不支持跨编译到iOS。
许可证
根据您的选择,许可为以下任一许可:
- Apache许可证第2版,(LICENSE-APACHE或https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT或http://opensource.org/licenses/MIT)
。
贡献
除非您明确声明,否则根据Apache-2.0许可证定义的您有意提交以包含在作品中的任何贡献,应如上所述双许可,而不附加任何额外条款或条件。
依赖关系
~9–18MB
~248K SLoC