Библиотека 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 за подсказки