Dll 查找在应用程序加载时失败

问题描述

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

  1. bevy 的动态链接功能
  2. 切换到 LLD 链接
  3. 每晚切换到最新的 Rust
  4. 禁用共享泛型(因为 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"

我的 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"]

构建我的应用程序后,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 这让我想知道为什么它首先存在。

我的问题是:

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)