将Rust dylib链接到C程序

时间:2015-04-04 09:07:06

标签: rust

如何从C正确链接到Rust库?鉴于我有一个名为foo的货物项目,它产生libfoo-<random-hash>.dylib。我如何链接它? clang只有在我将其重命名为libfoo.dylib时才能找到它但是为了运行程序libfoo-<random-hash>.dylib是必需的。我的解决方法是手动复制&amp;重命名lib但这不是正确的程序。

我编译和运行c程序的过程是:

$ cargo build
$ cp target/debug/libfoo-*.dylib target/debug/libfoo.dylib
$ clang -lfoo -L target/debug -o bar bar.c
$ LD_LIBRARY_PATH=target/debug ./bar

2 个答案:

答案 0 :(得分:1)

散列有一个目的:它在版本不匹配的情况下给出链接错误(对于跨框架内联尤其重要)。它还允许一个二进制文件链接到一个包的两个版本(例如,因为您的应用程序使用两个内部使用不同版本的库)。但在C世界,没有人关心这一点。如果您不关心,或者更关心如何轻松链接到您的库,只需重命名共享对象以摆脱哈希。

请注意,哈希是由Cargo添加的。如果通过直接调用rustc来构建,则不会添加任何哈希 - 但是没有人想要这样做。 AFAIK Cargo不提供省略哈希的选项,但您可能想尝试询问开发人员或提交问题。

或者,您可以从文件名中提取完整的库名称(包括哈希),并指示clang链接到该名称。然后,您将获得上述优势,但它使每个想要链接到您的库的人的构建过程变得更加复杂。

答案 1 :(得分:1)

自Rust 1.11起,Cargo支持 cdylib 用于此确切目的的工件类型:

[lib]
name            = "foo"
crate-type      = ["rlib", "cdylib"]

此定义产生一个./target/{release,debug}/libfoo.so 所有Rust依赖项都静态链接,因此可以将其链接到C中 马上进行项目。