问题描述
我正在尝试遵循 bevy's tutorial 并在 Windows 10 (21H1) x64 上设置所有内容。设置有点工作。我做了以下构建优化(来自 bevy 的教程):
- bevy 的动态链接功能
- 切换到 LLD 链接器
- 每晚切换到最新的 Rust
- 禁用共享泛型(因为 this issue)
我的cargo.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"
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"]
构建我的应用程序后,target/debug/ 看起来像这样(我删除了一些条目):
deps/
bevy_dylib.dll
bevy_dylib.dll.lib
bevy_dylib.pdb
foo.d
foo.exe
foo.pdb
我可以使用带有命令 cargo run --features bevy/dynamic
的货物很好地构建和运行应用程序。程序打印“hello”并正常存在。但是,如果我从终端(在我的情况下为 powershell)运行该程序,则不会打印任何内容并且该程序存在且没有错误代码。看到 lldb 也因“未知错误”而崩溃,我继续使用 procmon 仔细查看。
cargo run
vs .\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,这个问题是否可以解决?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)