2017-08-06 69 views
1

目标:System.DllNotFoundException在pocketsphinx痛饮统一窗口建设

获取一个包装DLL在Windows中的一个统一项目中使用pocketsphinx。

问题:

当运行测试程序,我得到一个恼人的System.DllNotFoundException即使.so文件是在同一目录下单程序。

安装和尝试的操作:

对于初学者,我使用的是Cygwin。我能够建立绝对的一切,sphinxbase和pocketsphinx没有问题。然后我进入了swig/csharp目录并尝试制作。它确实会创建一个.so文件。我正在使用默认的Makefile并在cygwin中生成。规则1-3运行得非常好,建设,链接和一切。那么,pocketsphinx_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 [email protected] 

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: DllImport error loading library 'C:\Users\fgera\Development\Tools\CMUSphinx\pocketsphinx\swig\csharp\libpocketsphinxwrap.so.dll': 'The system cannot find the file specified. 

很多次一遍又一遍。

任何帮助将不胜感激。同样,我需要在Unity中使用libpocketsphinx.so x86_64 for windows来与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); 
+0

你最好通过构建一个真正的Unity项目而不是使用mono来测试它。他们是不同的。 – zwcloud

+0

@zwcloud我在Unity中遇到同样的错误。 Unity也使用mono。它应该在两个方面工作。 – Fer

+0

再次..请编辑您的问题并发布test.cs的内容:让我们看看如何使用属性“DllImport”定义extern方法。 – zwcloud

回答

1

我怀疑Cygwin的DLL是单声道/统一兼容。您需要在Visual Studio中创建DLL,然后才能工作。

+0

现在怎么可能,如果我在我的机器上本地生成gcc的源代码,并且在Visual Studio控制台上使用dumpbin进行检查,是否可以读取所有的段? – Fer

0

你为什么用mono测试这个文件,而它实际上在Unity中使用?

单声道:错误的DllImport加载库 'C:\用户\ fgera \开发\工具\ CMUSphinx \ pocketsphinx \痛饮\ CSHARP \ libpocketsphinxwrap.so.dll':“系统找不到指定的文件。

如果文件libpocketsphinxwrap.soC:\Users\fgera\Development\Tools\CMUSphinx\pocketsphinx\swig\csharp\确实存在,尝试重命名libpocketsphinxwrap.solibpocketsphinxwrap.so.dll所以单可以找到它。

又见mono pinvoke: library namesDllNotfoundException


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

BTW,我宁愿写C#包装器,而不是因为有在的P/Invoke很多陷阱,我不认为痛饮可以处理所有的人都使用痛饮自己。

+0

Unity在单声道上运行。我正在用x86_64机器上的gcc编译源代码,并且我不强制-m32标志。当我在Unity上尝试文件时,我得到同样的错误。我读过你所引用的所有内容。谢谢。 – Fer

+0

我应该说Unity运行在修改过的古代单声道上。但是,是的,如果您的文件适用于单声道,它可能适用于Unity。 – zwcloud

+0

谢谢。我没有尝试.so,没有名字...... DEBU输出,单声道尝试所有可能的扩展,没有运气。 – Fer