如何在一个包装箱中生成.dll,并从另一个包装箱测试/链接?

时间:2019-06-28 07:39:30

标签: rust

背景

我无法在Windows上创建DLL“往返”。我想在板条箱a中生成一个DLL(以及后来的.so,...),我们希望将该DLL交付给客户。看起来像这样:

来自a/src/lib.rs

#[no_mangle]
pub unsafe extern "C" fn f(x: i32) -> i32 {
    x * x
}

来自a/Cargo.toml

[lib]
name = "a_library"
path = "src/lib.rs"
crate-type = [ "cdylib" ]

要测试该DLL,我有一个条板箱b,要在其中加载它并调用其功能。看起来像这样:

来自b/src/main.rs

#[link(name = "a_library", kind = "dylib")]
extern "C" {
    fn f(x: i32) -> i32;
}

来自b/Cargo.toml

[dependencies]
a = { path = "../a" }

crate-type设置为cdylib会产生a_library.dlla_library.dll.lib

.dll是我想要的。它应该产生一个动态(链接)库,而不产生静态库。同样,当我测试时,我想针对动态库进行测试。

我正在使用nightly-x86_64-pc-windows-msvc / 1.37.0-nighly,但是该解决方案应该可以在任何地方运行(包括稍后的MacOS / Linux)。

Repository with minimal test case that exhibits problem on Windows.

问题

但是,当我现在想在b中运行/测试我的测试应用程序时,我收到

LINK : fatal error LNK1181: cannot open input file 'a_library.lib'. 

嗯,这是正确的,因为Rust实际上从未从板条箱a_library.lib产生a,而只是产生a_library.dll.lib

问题

我必须对板条箱b进行什么更改才能使它起作用?

(我愿意更改a,只要它继续产生DLL,并且只要b在测试{{1}时仍然动态链接到a }。

0 个答案:

没有答案