将Rust dylib链接到C程序中

问题描述 投票:3回答:2

如何正确地从C链接到Rust库?给定我有一个名为foo的货物项目,该项目会产生libfoo-<random-hash>.dylib。我如何反对它? clang仅在我将其重命名为libfoo.dylib时才能找到,但要运行程序,需要libfoo-<random-hash>.dylib。我的解决方法是手动复制并重命名该库,但这不是正确的过程。

我编译和运行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
rust
2个回答
1
投票

哈希的作用是:在版本不匹配的情况下会给出链接错误(对于跨箱内联特别重要)。它还允许一个二进制文件链接到一个板条箱的两个版本(例如,因为您的应用程序使用了两个内部使用不同版本的库)。但是在C语言世界中,没有人关心。如果您既不在乎,也不在乎更容易链接到库,只需重命名共享库即可摆脱哈希。

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

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


0
投票

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

cdylib

此定义产生一个[lib] name = "foo" crate-type = ["rlib", "cdylib"] 所有Rust部门都静态链接,因此可以将其链接到C中马上进行项目。

© www.soinside.com 2019 - 2024. All rights reserved.