【问题标题】:C# .Net library cannot find dependencies on LinuxC# .Net 库在 Linux 上找不到依赖项
【发布时间】:2026-02-13 00:30:02
【问题描述】:

我遇到了与我的 SFML.Net 项目链接的依赖项问题: 我成功导入了 SFML.Net DLL,因此程序编译没有问题。但是一旦我运行它,它就会崩溃,并告诉以下内容:

System.DllNotFoundException: /usr/local/lib/libcsfml-graphics.so
  at (wrapper managed-to-native) SFML.Graphics.RenderWindow:sfRenderWindow_createUnicode (SFML.Window.VideoMode,intptr,SFML.Window.Styles,SFML.Window.ContextSettings&)
  at SFML.Graphics.RenderWindow..ctor (VideoMode mode, System.String title, Styles style, ContextSettings settings) [0x00043] in <filename unknown>:0 
  at SFML.Graphics.RenderWindow..ctor (VideoMode mode, System.String title) [0x0000b] in <filename unknown>:0 
  at SFML_Test.Game.Display () [0x00010] in <filename unknown>:0 
  at SFML_Test.Program.Main (System.String[] args) [0x00010] in <filename unknown>:0 

我在 Ubuntu Linux 上使用 Mono 编译器和 Monodevelop IDE,所以我使用的是 dll 映射,它有效(.Net DLL 确实为 csfml 库寻找正确的路径)

权限都设置好了

alex@alexpc:/usr/local/lib$ ls -l
total 960
-rwxr-xr-x 1 alex alex   55833 Mar 22 07:35 libcsfml-audio.so.2.2
-rwxr-xr-x 1 alex alex   55833 Mar 22 07:35 libcsfml-audio.so.2.2.0
-rwxr-xr-x 1 alex alex  166721 Mar 22 07:35 libcsfml-graphics.so
-rwxr-xr-x 1 alex alex  166721 Mar 22 07:35 libcsfml-graphics.so.2.2
-rwxr-xr-x 1 alex alex  166721 Mar 22 07:35 libcsfml-graphics.so.2.2.0
-rwxr-xr-x 1 alex alex   69291 Mar 22 07:35 libcsfml-network.so
-rwxr-xr-x 1 alex alex   69291 Mar 22 07:35 libcsfml-network.so.2.2
-rwxr-xr-x 1 alex alex   69291 Mar 22 07:35 libcsfml-network.so.2.2.0
-rwxr-xr-x 1 alex alex   15287 Mar 22 07:35 libcsfml-system.so
-rwxr-xr-x 1 alex alex   15287 Mar 22 07:35 libcsfml-system.so.2.2
-rwxr-xr-x 1 alex alex   15287 Mar 22 07:35 libcsfml-system.so.2.2.0
-rwxr-xr-x 1 alex alex   32179 Mar 22 07:35 libcsfml-window.so
-rwxr-xr-x 1 alex alex   32179 Mar 22 07:35 libcsfml-window.so.2.2
-rwxr-xr-x 1 alex alex   32179 Mar 22 07:35 libcsfml-window.so.2.2.0

而且代码最少:

程序.cs

using System;

namespace SFML_Test
{
    public class Program 
    {
        public static void Main (string[] args)
        {
            Console.WriteLine("Starting window");
            Game game = new Game ();
            try
            {
                game.Display ();
            }
            catch (Exception e) {

                Console.WriteLine (e.ToString());
            }
        }
    }
}

Game.cs

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

namespace SFML_Test
{
    class Game
    {
        private RenderWindow _window;

        public void Display ()
        {
            _window = new RenderWindow(new VideoMode(800, 600), "SFML window");
            _window.SetVisible(true);
            _window.Closed += new EventHandler(OnClosed);
            while (_window.IsOpen)
            {
                _window.DispatchEvents();
                _window.Clear(Color.Red);
                _window.Display();
            }
        }

        private void OnClosed(object sender, EventArgs e)
        {
            _window.Close();
        }
    }
}

我只是不明白为什么 .Net dll 找不到 csfml linux 库,即使它清楚地查看了正确的目录并且应该可以毫无问题地找到它们。

当然,我也尝试从映射中删除路径,以便程序查看可执行文件的文件夹,但无济于事

有人知道为什么会出现这个问题吗? .Net DLL 是否在其他文件夹中搜索(如 /some/library/folder/usr/local/lib/libcs​​fml-graphics.so)?这可以解释为什么找不到文件。

我现在有点绝望,所以如果有人知道,请竖起大拇指以获得任何答案!

亚历克斯

tl;dr:Mono 编译器/Linux,.Net DLL 即使在正确的文件夹中搜索也找不到另一个依赖项

【问题讨论】:

  • 此文档链接包含我认为诊断此问题所需的所有信息:mono-project.com/docs/advanced/pinvoke/dllnotfoundexception
  • 好的小更新:似乎确实找到了 csfml dll。所述dll需要sfml库(至于为什么,我不明白这一点):Mono:DllImport正在尝试加载:'libcs​​fml-graphics.so.2.2'。单声道:DllImport 错误加载库'/home/alex/SFML_Test/SFML_Test/bin/Release/libcs​​fml-graphics.so.2.2':'libsfml-graphics.so.2.2.0:无法打开共享对象文件:没有这样的文件或目录'。似乎找不到“libsfml-graphics.so.2.2.0”。当然我试图把它放在可执行文件旁边,但无济于事......你认为它在哪里寻找它?

标签: c# linux mono sfml sfml.net


【解决方案1】:

天哪,有很多话要说

所以问题是 C 绑定需要 C++ sfml 库,但它找不到它。我试图移动文件以使库与我的可执行文件位于同一文件夹中,当然这是 Windows 的做法。事实证明,在 Linux 中,规范是使用库缓存来查找所述文件。所以我使用 ld.so.conf 文件缓存了 sfml 库,一切顺利

感谢 Evk 提供线索

【讨论】: