首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是什么原因导致.NET核心二进制文件加载本机库,然后抛出一个DllNotFoundException?

是什么原因导致.NET核心二进制文件加载本机库,然后抛出一个DllNotFoundException?
EN

Stack Overflow用户
提问于 2019-01-12 01:46:25
回答 1查看 1.3K关注 0票数 3

我试图在MacOS上运行一个MacOS游戏,并将该游戏移植到.NET核心。

我无法让SFML在运行时正确地加载它的本机依赖项,所以我设置了一个最小的测试示例来尝试隔离这个问题,并且仍然得到以下错误输出(我已经设置了DYLD_PRINT_LIBRARIES):

代码语言:javascript
复制
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

我试图运行的代码如下:

代码语言:javascript
复制
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中有相关的本机库的副本(这不是一个永久的设置-只是在实验中),它似乎试图在放弃和卸载它们之前,按顺序加载它们。

考虑到这一点,我基本上想知道是什么导致了这种情况?

我怀疑这可能表明我的图书馆是错误的版本?(我已经尝试过CSFML 2.2、2.3和2.5,所以为了我的理智起见,我希望情况不是这样),或者可能缺少了它正在尝试加载的依赖项,但是加载失败了?是否有任何方法从dyld获得进一步的调试信息?

我已经尝试过搜索这方面的内容,但是很难找到任何有用的资源,因此我希望了解更好地理解运行时链接系统的人的指示。

我不完全确定什么额外的信息将有助于回答这个问题。我的希望是,有一套具体的,明确的方案,在其中,这种行为可以浮出水面,我可以应用到解决我的具体问题。否则,我很乐意提供任何帮助的额外信息。

我的.NET核心版本是2.2.101

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-18 00:25:58

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

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

代码语言:javascript
复制
$ 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

若要更改您可以做的路径:

代码语言:javascript
复制
$ install_name_tool -id "@loader_path/../libtest.dylib" libtest.dylib 

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

代码语言:javascript
复制
Load command 2 <-- NEW
          cmd LC_ID_DYLIB
      cmdsize 64
         name @loader_path/../libtest.dylib (offset 24)

如果您想使用rpath,则可以这样做:

代码语言:javascript
复制
$ install_name_tool -id "@rpath/libtest.dylib" libtest.dylib

我回答了a previous question关于rpathloader_path的问题,后者更详细地讨论了这个问题。在加载动态库的情况下,每个场景都有潜在的不同,因此它实际上取决于通过otool -l进行调查的结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54156107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档