如何从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
答案 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中
马上进行项目。