我正在尝试按照bevy 的教程在 Windows 10 (21H1) x64 上设置所有内容。设置有点工作。我做了以下构建优化(来自 bevy 的教程):
- bevy的动态链接功能
- 切换到 LLD 链接器
- 每晚切换到最新的 rust
- 禁用共享泛型(因为这个问题)
我的货物.toml
[package]
name = "foo"
version = "0.1.0"
authors = ["foo <foo@bar.com>"]
edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
bevy = "0.5"
我的 main.rs(迄今为止唯一的代码文件):
use bevy::prelude::*;
fn main() {
println!("hello");
App::build().run();
}
我的 .cargo/config.toml:
[target.x86_64-pc-windows-msvc]
linker = "rust-lld.exe"
rustflags = ["-Zshare-generics=off"]
构建我的应用程序后,目标/调试/看起来像这样(我删除了一些条目):
deps/
bevy_dylib.dll
bevy_dylib.dll.lib
bevy_dylib.pdb
foo.d
foo.exe
foo.pdb
我可以通过命令使用 cargo 构建和运行应用程序cargo run --features bevy/dynamic
。程序打印“hello”,正常存在。但是,如果我从终端(在我的情况下为 powershell)运行程序,则不会打印任何内容,并且程序存在且没有错误代码。看到 lldb 也因“未知错误”而崩溃,我继续使用procmon仔细查看。
cargo run
对比.\foo.exe
使用cargo run --features bevy/dynamic
工作正常,但.\foo.exe
(直接从 powershell 运行)失败且没有错误。Procmon 显示.\foo.exe
尝试加载不同的 dll,它搜索bevy_dylib-d54840081e5b3869.dll
而不是bevy_dylib.dll
. 这显然失败了,因为该文件不存在,因此程序甚至在到达main()
.
但是为什么会cargo run --features bevy/dynamic
起作用呢?好吧,事实证明程序仍然尝试加载bevy_dylib-d54840081e5b3869.dll
,但是这次加载器查找不同的路径。还有一个额外的搜索路径:{my_project}/target/debug/deps/
. 该目录实际上有一个具有该确切名称的dll,然后加载该dll,程序可以正常执行。所以事实证明,我们甚至从未尝试使用 dll target/debug/bevy_dylib.dll
,这让我想知道为什么它一开始就在那里。
我的问题是:
- 为什么
cargo run
在加载时链接时使用额外的查找目录? - 为什么程序搜索
bevy_dylib-d54840081e5b3869.dll
而不是bevy_dylib.dll
? - 如果没有一些手动复制 dll 的讨厌的后期构建任务,这是否可以修复?