gpt4 book ai didi

macos - 什么会导致 .NET Core 二进制文件加载 native 库,然后抛出 DllNotFoundException?

转载 作者:行者123 更新时间:2023-12-05 06:28:40 25 4
gpt4 key购买 nike

我正在尝试在将游戏移植到 .NET Core 的 MacOS 上运行 SFML.NET 游戏。

我一直无法让 SFML 在运行时正确加载其 native 依赖项,​​因此我设置了一个最小的测试示例来尝试隔离问题,但仍然得到以下错误输出(我已设置 DYLD_PRINT_LIBRARIES):

dyld: loaded: /System/Library/Frameworks/CoreData.framework/Versions/A/CoreData
dyld: loaded: /System/Library/Frameworks/ServiceManagement.framework/Versions/A/ServiceManagement
dyld: loaded: /System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Versions/A/BackgroundTaskManagement
dyld: loaded: /usr/lib/libxslt.1.dylib
dyld: loaded: /usr/local/share/dotnet/shared/Microsoft.NETCore.App/2.2.0/libclrjit.dylib
dyld: loaded: /usr/local/share/dotnet/shared/Microsoft.NETCore.App/2.2.0/System.Globalization.Native.dylib
dyld: loaded: /usr/local/share/dotnet/shared/Microsoft.NETCore.App/2.2.0/System.Native.dylib
Hello World!
dyld: loaded: /Users/ashley/RiderProjects/SFML.NET Test/SFML.NET Test/bin/Debug/netcoreapp2.2/libcsfml-window.dylib
dyld: unloaded: /Users/ashley/RiderProjects/SFML.NET Test/SFML.NET Test/bin/Debug/netcoreapp2.2/libcsfml-window.dylib
dyld: loaded: libcsfml-window.dylib
dyld: unloaded: libcsfml-window.dylib

Unhandled Exception: System.DllNotFoundException: Unable to load shared library 'libcsfml-window.dylib' or one of its dependencies. In order to help diagnose loading problems, consider setting the DYLD_PRINT_LIBRARIES environment variable: dlopen(liblibcsfml-window.dylib.dylib, 1): image not found
at SFML.Window.VideoMode.sfVideoMode_getDesktopMode()
at SFML.Window.VideoMode.get_DesktopMode() in /Users/ashley/SFML.Net/src/Window/VideoMode.cs:line 86
at SFML.NET_Test.Program.Main(String[] args) in /Users/ashley/RiderProjects/SFML.NET Test/SFML.NET Test/Program.cs:line 12
dyld: unloaded: /usr/local/share/dotnet/shared/Microsoft.NETCore.App/2.2.0/libhostpolicy.dylib

我尝试运行的代码如下:

using System;
using SFML.Graphics;
using SFML.Window;

namespace SFML.NET_Test
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
RenderWindow window = new RenderWindow(VideoMode.DesktopMode, "Test");
while (true)
{
}
}
}
}

我在运行目录和可执行 bin 中有相关 native 库的副本(这不是永久设置 - 只是在试验时)并且它似乎尝试按顺序加载两者,然后放弃和卸载它们。

鉴于此,我基本上想知道是什么导致了这种情况的发生?

我怀疑这可能表明我的库版本错误? (我已经尝试过 CSFML 2.2、2.3、2.5,所以为了我的理智起见,我希望情况并非如此)或者可能缺少它正在尝试加载但未能加载的依赖项?有没有办法从 dyld 中获取更多调试信息?

我已经尝试搜索这方面的内容,但很难找到任何有用的资源,所以我很感激那些更了解运行时链接系统的人的指点。

我不完全确定哪些额外信息有助于回答这个问题。我希望有一组特定的、定义明确的场景可以让这种行为浮出水面,我可以应用它来解决我的特定问题。否则,我很乐意提供任何有帮助的额外信息。

我的 .NET Core 版本是 2.2.101

最佳答案

在评论中的讨论之后,SMFL 的预构建二进制文件似乎在其中设置了不正确的路径和文件名。这些类型的问题通常可以通过 otoolinstall name tool 实用程序检查二进制文件然后更改需要加载的库的路径/名称来解决。

otool -l 的示例可能如下所示:

$ otool -l /path/to/binary
Load command 2 <-- OLD
cmd LC_ID_DYLIB
cmdsize 40
name libtest.dylib (offset 24)
time stamp 1 Wed Dec 31 18:00:01 1969

要更改您可以执行的路径:

$ install_name_tool -id "@loader_path/../libtest.dylib" libtest.dylib 

这将为您提供一条新路径,例如:

Load command 2 <-- NEW
cmd LC_ID_DYLIB
cmdsize 64
name @loader_path/../libtest.dylib (offset 24)

如果你想使用 rpath 而不是你可以这样做:

$ install_name_tool -id "@rpath/libtest.dylib" libtest.dylib

我回答了 a previous question 关于 rpathloader_path,其中更详细地介绍了该主题。在加载动态库的情况下,每个场景都可能不同,因此它实际上归结为您通过 otool -l 调查发现的内容。

关于macos - 什么会导致 .NET Core 二进制文件加载 native 库,然后抛出 DllNotFoundException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54156107/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com