在pocketsphinx swig Unity窗口构建中的System.DllNotFoundException

时间:2017-08-06 04:43:07

标签: unity3d mono swig pocketsphinx dllnotfoundexception

目标:

获取一个包装器dll,以便在Windows的Unity项目中使用pocketsphinx。

问题:

运行测试程序时,即使.so文件与单声道程序位于同一目录中,我也会感到烦恼System.DllNotFoundException

设置和尝试的操作:

首先,我正在使用Cygwin。我能够构建绝对一切,sphinxbase和pocketsphinx没问题。然后我进入swig / csharp目录并尝试make。它确实创建了.so文件。我正在使用默认的Makefile并在cygwin中制作。规则1-3运行完美,建立,链接和一切。 pocketphinx_continuous测试也是如此。

pocketsphinx.c: ../pocketsphinx.i
    mkdir -p gen
    swig -I.. -I../../../sphinxbase/swig -I../include -I../../sphinxbase/include \
        -csharp \
        -dllimport "libpocketsphinxwrap.so" \
        -namespace "Pocketsphinx" -o sphinxbase.c \
        -outdir gen ../../../sphinxbase/swig/sphinxbase.i
    swig -I.. -I../../../sphinxbase/swig -I../include -I../../sphinxbase/include \
        -csharp \
        -dllimport "libpocketsphinxwrap.so" \
        -namespace "Pocketsphinx" -o pocketsphinx.c \
        -outdir gen ../pocketsphinx.i

libpocketsphinxwrap.so: pocketsphinx.c
    gcc -fPIC pocketsphinx.c sphinxbase.c `pkg-config --libs --cflags pocketsphinx` -shared -o $@

test.exe: libpocketsphinxwrap.so
    mcs test.cs gen/*.cs

run: test.exe
    MONO_LOG_LEVEL=debug mono test.exe

clean:
    rm -rf gen
    rm -f libpocketsphinxwrap.so
    rm -f pocketsphinx.c
    rm -f sphinxbase.c
    rm -f test.exe

.PHONY: run clean

尝试mono test.exe时,会发生以下情况:

Unhandled Exception:
System.TypeInitializationException: The type initializer for 'Pocketsphinx.PocketSphinxPINVOKE' threw an exception. ---> System.TypeInitializationException: The type initializer for 'SWIGExceptionHelper' threw an exception. ---> System.DllNotFoundException: libpocketsphinxwrap.so

.so与test.exe文件位于同一目录中,当然正在查看,因为在使用MONO_LOG_LEVEL=debug运行mono时,输出为:

Mono: DllImport error loading library 'C:\Users\fgera\Development\Tools\CMUSphinx\pocketsphinx\swig\csharp\libpocketsphinxwrap.so.dll': 'The system cannot find the file specified.

一遍又一遍。

任何帮助将不胜感激。同样,我需要一个libpocketsphinx.so x86_64用于Unity中的窗口以与C#文件互操作。

感谢。

---编辑 - 添加了相关代码段。 test.cs只是从包装器数据结构中调用此方法。这些文件都是由SWIG生成的。

  [global::System.Runtime.InteropServices.DllImport("libpocketsphinxwrap.so", EntryPoint="CSharp_Pocketsphinx_Decoder_GetConfig")]
  public static extern global::System.IntPtr Decoder_GetConfig(global::System.Runtime.InteropServices.HandleRef jarg1);

2 个答案:

答案 0 :(得分:1)

我怀疑Cygwin DLL与Mono / Unity兼容。您需要在Visual Studio中创建DLL,然后它才能工作。

答案 1 :(得分:0)

为什么用mono测试so文件,而它实际上是用在Unity?

  

单声道:DllImport错误加载库' C:\ Users \ fgera \ Development \ Tools \ CMUSphinx \ pocketsphinx \ swig \ csharp \ libpocketsphinxwrap.so.dll':'系统找不到指定文件。

如果libpocketsphinxwrap.so中确实存在文件C:\Users\fgera\Development\Tools\CMUSphinx\pocketsphinx\swig\csharp\,请尝试将libpocketsphinxwrap.so重命名为libpocketsphinxwrap.so.dll,以便单声道可以找到它。

另请参阅mono pinvoke: library namesDllNotfoundException

您可以尝试使用Visual Studio从it is offically supported开始构建pocketsphinx。

顺便说一句,我宁愿自己编写C#包装器而不是使用SWIG,因为P / Invoke中有很多陷阱,我不认为SWIG可以处理所有这些陷阱。