Rust cargo dylib 澄清说明

7

我有一个Rust项目,想将其作为dylib嵌入到另一个应用程序中。我在Cargo.toml中设置了crate_type = ["dylib"],但我不确定这是否应该改为cdylib

构建项目后,它会像预期的那样在target/debug目录下生成一个libfoo.dylib,但是通过运行otool -L命令查看,它还链接到了target/debug/deps/目录下的一个libfoo.dylib。如果我要在另一个应用程序中使用它,我需要提供两个dylibs吗?

此外,当crate类型为cdylib时,它也会生成两个dylibs,但依赖项中的那个文件名结尾会附加一个哈希值。我不确定这两种crate类型之间的区别。

我可以使用rustc避免获取两个dylibs,但我想使用cargo。在其他应用程序中嵌入Rust作为dylib的推荐方法是什么?

我正在macOS 10.12上使用Rust,如果这很重要。

1个回答

10
经过更多的研究,cdylib 静态链接 Rust 依赖项,而 dylib 用于与其他 Rust 项目动态链接。关于嵌入式方面,我找到的所有资料都建议静态链接 Rust 库是推荐的方式。如果要动态使用 Rust 库,则在我的 [profile] 部分中设置 rpath = true 可以解决冗余 dylibs 的问题。

1
你在研究中使用了哪些来源来发现这个问题? - jv-dev
1
@jv-dev 好久不见了,所以我认为确切的文档已经改变了,但这里有两个不同的链接,讨论Rust中的链接:https://doc.rust-lang.org/rustc/command-line-arguments.html?highlight=dylib#--crate-type-a-list-of-types-of-crates-for-the-compiler-to-emithttps://doc.rust-lang.org/reference/linkage.html - jefftime

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