MonoGame应用程序说SDL.dll缺失,即使它存在。为什么?

时间:2014-08-06 22:54:26

标签: c# sdl monogame

我在Visual Studio中使用Linux游戏模板构建了一个MonoGame应用程序。它使用.NET或Mono在Windows上运行,但在Linux上失败。

错误是关于SDL.dll的DllNotFoundException,但SDL.dll始终位于二进制文件目录中。该文件不是CLR程序集,因此它不在引用中。相反,我在构建期间从MonoGame的Assemblies / Linux目录中复制了它(并且所有相关的CLR程序集也从该文件夹中复制)。无论我是在Visual Studio或Xamarin Studio中的Windows下构建项目还是在MonoDevelop中的Linux下构建项目,都会出现错误。没有构建错误。

这是相关的堆栈跟踪:

System.DllNotFoundException: SDL.dll
  at (wrapper managed-to-native) Tao.Sdl.Sdl:__SDL_InitSubSystem (int)
  at Tao.Sdl.Sdl.SDL_InitSubSystem (Int32 flags) [0x00000] in <filename unknown>:0 
  at Microsoft.Xna.Framework.OpenTKGamePlatform..ctor (Microsoft.Xna.Framework.Game game) [0x00000] in <filename unknown>:0 
  at Microsoft.Xna.Framework.GamePlatform.Create (Microsoft.Xna.Framework.Game game) [0x00000] in <filename unknown>:0 
  at Microsoft.Xna.Framework.Game..ctor () [0x00000] in <filename unknown>:0 

(我没有包含代码,因为这与我的代码无关 - 即使我从模板构建了一个新项目,也会发生这种情况。我已经谷歌搜索了好几个小时了这已经尝试了各种论坛中提出的所有组合,但我还没有找到解决方案。)

我该怎么做才能解决这个问题?


附录:使用MONO_LOG_LEVEL=debug,我可以看到运行时尝试查找DLL,并且他们都说未找到该文件。当我尝试&#34;帮助&#34;通过将文件重命名为libSDL.dll(或其他任何其他寻找的东西)的运行时,它表示&#34;无效的ELF标题&#34;并忽略它。这可能是预期的,因为它看起来像Win32二进制文件(不是CLR程序集)。

2 个答案:

答案 0 :(得分:4)

背景:

实际上,SDL.dll(来自Assemblies / Linux)是一个Win32二进制文件。它被包含在&#34; MonoGame for Linux&#34;模板是这样的,游戏也可以在Windows下运行。在Linux下,不会触及DLL。相反,Mono搜索SDL库的本机Linux版本。但是,出于某种原因,它无法映射。

<强>解决方案:

  1. 确保在Linux系统上安装了libSDL库。
  2. 转到您的项目并添加名为Tao.Sdl.dll.config的文件。这是因为我们想为Tao.Sdl.dll程序集编写应用程序配置文件(因为对SDL的调用是从Tao.Sdl.dll内部发生的)。
  3. 确保此新文件的构建操作是内容,并将其复制到输出目录。
  4. 在新文件中写下以下内容(适用于libSDL 1.2 - 其他版本可能需要不同的名称):

    <?xml version="1.0" encoding="utf-8"?> <configuration> <dllmap dll="SDL.dll" target="libSDL-1.2.so.0" /> <dllmap dll="SDL_image.dll" target="libSDL_image-1.2.so.0" /> <dllmap dll="SDL_mixer.dll" target="libSDL_mixer-1.2.so.0" /> <dllmap dll="SDL_ttf.dll" target="libSDL_ttf-2.0.so.0" /> <dllmap dll="SDL_net.dll" target="libSDL_net-1.2.so.0" /> <dllmap dll="smpeg.dll" target="libsmpeg-0.4.so.0" /> <dllmap dll="SDL_gfx.dll" target="libSDL_gfx.so.4" /> </configuration>

  5. 清理并构建。

  6. 现在,Mono应该有足够的信息在您的系统上找到libSDL。

答案 1 :(得分:1)

确实,您找到的解决方案可以解决您遇到的问题,但现在可以采用更简单的方法。

  1. 在您的项目中安装Linux Nuget(https://www.nuget.org/profiles/MonoGame)。这将自动生成必要的映射。
  2. (可能没有必要)如果从Linux模板启动项目,新的Nugets应该已经删除了默认添加的任何引用,但如果没有,请按照Nuget自述文件中的说明删除它们
  3. 在Linux OS中运行时,您可能需要安装一些可能依赖于您的系统的SDL相关库。例如,在我的情况下(debian)我已经有了libsdl1.2debian(提供&#34; libSDL-1.2.so.0&#34;)但是当我开始游戏时它确定了&#34; libSDL_mixer-1.2。 so.0&#34;因为缺少了,所以我在aptcache搜索中查找并找到了libsdl-mixer1.2包。安装完毕后,游戏执行没有问题。