我在与 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编译器和MonodevelopIDE,所以我使用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());
}
}
}
}
游戏.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)?这可以解释为什么找不到该文件。
在这一点上我有点绝望,所以如果有人知道,请竖起大拇指以获得任何答案!
亚历克斯
tl;dr:Mono编译器/Linux,.Net DLL即使在正确的文件夹中搜索也无法找到另一个依赖项
哦,天哪,有很多话要说
所以问题是 C 绑定需要 C++ sfml 库,而找不到它。我试图移动文件以使库与我的可执行文件位于同一文件夹中,当然这是Windows的方式。事实证明,在 Linux 中,规范是使用库缓存来查找所述文件。所以我使用 ld.so.conf 文件缓存了 sfml 库,一切都解决了
感谢埃夫克的线索