1

我正在尝试按照bevy 的教程在 Windows 10 (21H1) x64 上设置所有内容。设置有点工作。我做了以下构建优化(来自 bevy 的教程):

  1. bevy的动态链接功能
  2. 切换到 LLD 链接器
  3. 每晚切换到最新的 rust
  4. 禁用共享泛型(因为这个问题

我的货物.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,这让我想知道为什么它一开始就在那里。

我的问题是:

  1. 为什么cargo run在加载时链接时使用额外的查找目录?
  2. 为什么程序搜索bevy_dylib-d54840081e5b3869.dll而不是bevy_dylib.dll
  3. 如果没有一些手动复制 dll 的讨厌的后期构建任务,这是否可以修复?
4

0 回答 0