2015-02-06 154 views
2

我试图在Ubuntu上使用MasterQ32's OpenWorld.Engine。我遵循了“Documentation”的示例场景。除资产导入外,一切运行良好。有趣的是,Windows 7也出现同样的错误:Assimp.NET的库加载程序找不到kernel32.dll。下面是堆栈跟踪:在Mono/Linux下编译Assimp.NET

Unhandled Exception: 
System.DllNotFoundException: kernel32 
    at (wrapper managed-to-native) Assimp.Unmanaged.NativeMethods:LoadLibrary (string) 
    at Assimp.Unmanaged.AssimpLibraryImplementation.LoadLibrary (System.String path) [0x00000] in <filename unknown>:0 
    at Assimp.Unmanaged.AssimpLibrary.LoadLibrary (System.String libPath) [0x00000] in <filename unknown>:0 
    at Assimp.Unmanaged.AssimpLibrary.LoadLibrary (System.String lib32Path, System.String lib64Path) [0x00000] in <filename unknown>:0 
    at Assimp.Unmanaged.AssimpLibrary.LoadLibrary() [0x00000] in <filename unknown>:0 
    at Assimp.Unmanaged.AssimpLibrary.LoadIfNotLoaded() [0x00000] in <filename unknown>:0 
    at Assimp.Unmanaged.AssimpLibrary.EnableVerboseLogging (Boolean enable) [0x00000] in <filename unknown>:0 
    at Assimp.AssimpImporter.PrepareImport() [0x00000] in <filename unknown>:0 
    at Assimp.AssimpImporter.ImportFileFromStream (System.IO.Stream stream, PostProcessSteps postProcessFlags, System.String formatHint) [0x00000] in <filename unknown>:0 
    at OpenWorld.Engine.Model.Load (OpenWorld.Engine.AssetLoadContext context, System.IO.Stream stream, System.String extensionHint) [0x00000] in <filename unknown>:0 
    at OpenWorld.Engine.Asset+<Load>c__AnonStorey0`1[OpenWorld.Engine.Model].<>m__0() [0x00000] in <filename unknown>:0 
    at OpenWorld.Engine.Game.DeferRoutines() [0x00000] in <filename unknown>:0 
    at System.Threading.Thread.StartInternal() [0x00000] in <filename unknown>:0 
[ERROR] FATAL UNHANDLED EXCEPTION: System.DllNotFoundException: kernel32 
    at (wrapper managed-to-native) Assimp.Unmanaged.NativeMethods:LoadLibrary (string) 
    at Assimp.Unmanaged.AssimpLibraryImplementation.LoadLibrary (System.String path) [0x00000] in <filename unknown>:0 
    at Assimp.Unmanaged.AssimpLibrary.LoadLibrary (System.String libPath) [0x00000] in <filename unknown>:0 
    at Assimp.Unmanaged.AssimpLibrary.LoadLibrary (System.String lib32Path, System.String lib64Path) [0x00000] in <filename unknown>:0 
    at Assimp.Unmanaged.AssimpLibrary.LoadLibrary() [0x00000] in <filename unknown>:0 
    at Assimp.Unmanaged.AssimpLibrary.LoadIfNotLoaded() [0x00000] in <filename unknown>:0 
    at Assimp.Unmanaged.AssimpLibrary.EnableVerboseLogging (Boolean enable) [0x00000] in <filename unknown>:0 
    at Assimp.AssimpImporter.PrepareImport() [0x00000] in <filename unknown>:0 
    at Assimp.AssimpImporter.ImportFileFromStream (System.IO.Stream stream, PostProcessSteps postProcessFlags, System.String formatHint) [0x00000] in <filename unknown>:0 
    at OpenWorld.Engine.Model.Load (OpenWorld.Engine.AssetLoadContext context, System.IO.Stream stream, System.String extensionHint) [0x00000] in <filename unknown>:0 
    at OpenWorld.Engine.Asset+<Load>c__AnonStorey0`1[OpenWorld.Engine.Model].<>m__0() [0x00000] in <filename unknown>:0 
    at OpenWorld.Engine.Game.DeferRoutines() [0x00000] in <filename unknown>:0 
    at System.Threading.Thread.StartInternal() [0x00000] in <filename unknown>:0 

这里是我使用的代码,基本上等同于一个在Doc:设置一个场景中的摄像头和一个对象。我正在使用存储库中提供的资产,并验证资产路径是否正确。

using System; 
using System.IO; 
using OpenWorld.Engine; 
using System.Drawing; 
using OpenTK.Graphics; 
using OpenWorld.Engine.SceneManagement; 
using OpenTK; 

namespace OpenWorldLearn { 

    public class TestGame : Game { 
     Scene scene; 
     PerspectiveLookAtCamera camera; 

     protected override PresentationParameters GetPresentationParameters() { 
      var def = base.GetPresentationParameters(); 
      def.GraphicsMode = new GraphicsMode(24, 24, 0, 0); 
      def.Resolution = new Size(800, 600); 
      def.IsFullscreen = false; 
      def.Title = "Potato!"; 
      return def; 
     } 

     protected override void OnLoad() { 
      FrameBuffer.ClearColor = OpenWorld.Engine.Color.CornflowerBlue; 

      Assets.Sources.Add(new FileSystemAssetSource("../../../Assets")); 

      camera = new PerspectiveLookAtCamera(); 
      camera.FieldOfView = 90; 
      camera.LookAt(new Vector3(-0.1f, 1.9f, -4f), Vector3.Zero); 

      scene = new Scene(); 

      SceneNode child = new SceneNode(); 
      var renderer = child.Components.Add<Renderer>(); 
      renderer.Model = Assets.Load<Model>("crate"); 
      scene.Root.Children.Add(child); 
     } 

     protected override void OnUpdate(GameTime time) { 
      scene.Update(time); 
     } 

     protected override void OnDrawPostState(GameTime time) { 
      FrameBuffer.Clear(); 
      scene.Draw(this.camera, time); 
     } 
    } 
} 
+0

显然,这不会在Linux上工作......我也非常怀疑它不适用于Windows 7. – leppie 2015-02-06 11:48:45

+0

那么,至少在Xamarin Studio for Windows中,我会得到相同的结果。 (我永远不会下载7GB的IDE,需要一个月的时间) – Kroltan 2015-02-06 11:51:12

+1

Assimp.NET只使用kernel32中的3个函数(libc也提供类似的功能)。但鉴于它会尝试加载DLL,它仍然不会在非Windows上工作。我建议你寻找该库的非Windows端口。 – leppie 2015-02-06 11:54:25

回答

1

我想我已经制定了这是怎么回事 - 它在寻找一个叫于LD_LIBRARY_PATH用P Assimp32.so/Assimp64.so文件/调用dlopen,但这总是返回IntPtr.Zero因为它真的叫libassimp.so,在被发现/usr/lib/libassimp.so如果你在32位ubuntu 14.04上安装libassimp-dev。 (注:有你装assimp本地标题为您的平台?)

此外,如果是我,我会重构这个本身与标准纵信任CLR做dlopen/dlsym/dlclose/Invoke的,而不是直接手卷此pinvokes到操作系统API。然后你可以用DllImportAttribute用extern方法有效地替换AssimpFunctionNames中的const函数名称。 OTOH是我认为合理的一个地方,它是DarkJava,其中函数名称在编译时确实不知道。

+0

你好,很抱歉,很迟才回复。我下载了最新的AssimpNet源代码并修改了代码,以便正确查找'/ usr/lib/libassimp.so',现在又出现了一个新问题:Assimp试图从'Assimp.InternalInterop'调用未实现的方法。 (实际上,整个班级都没有实现)以下是堆栈跟踪:http://pastebin.com/wXhtwezC。 – Kroltan 2015-02-21 19:03:35

+0

确实[this](https://www.google.co.uk/url?sa=t&source=web&rct=j&ei=ROboVILrGoS-PJj3gPAB&url=http://stackoverflow.com/questions/1086294/convert-array-of- structs-to-intptr&ved = 0CBwQFjAA&usg = AFQjCNEkkE3c1usHaeR4yv1M5yFwrMSHXw&sig2 = T1a_k9qLLfGng2RYUbox_w)help?元帅已经有将原语放入本地数组的方法。但问一个新的问题.... – 2015-02-21 20:12:59