Библиотека C# .Net не может найти зависимости от Linux

У меня возникли проблемы с зависимостями, связанными с моим проектом SFML.Net: я успешно импортировал библиотеки DLL SFML.Net, и поэтому программа компилируется без проблем. Но когда я запускаю его, он падает, сообщая следующее:

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 

Я использую Mono-компилятор и Monodevelop IDE в Ubuntu Linux, поэтому я использую dll mapping, который работает (.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

И код минимален:

Program.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/libcsfml-graphics.so)? Это объясняет, почему файл просто не найден.

Я немного отчаялся в этом вопросе, поэтому, если кто-нибудь знает, спасибо за любой ответ!

Alex

tl; dr: Mono compiler / Linux,.Net DLL не может найти другую зависимость, даже если он ищет в нужной папке

1 ответ

О, мальчик, так много можно сказать

поэтому проблема заключалась в том, что для привязки C нужна библиотека C++ sfml, и она не смогла найти ее. Я попытался переместить файлы, чтобы сделать библиотеки в той же папке, что и мой исполняемый файл, и, конечно, это был способ Windows сделать это. Оказывается, в Linux нормой является использование библиотечного кэша для поиска указанного файла. Поэтому я кэшировал библиотеки sfml, используя файл ld.so.conf, и все получилось

Спасибо Evk за подсказки

Другие вопросы по тегам