目标:
获取一个包装器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);
答案 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 names和DllNotfoundException。
您可以尝试使用Visual Studio从it is offically supported开始构建pocketsphinx。
顺便说一句,我宁愿自己编写C#包装器而不是使用SWIG,因为P / Invoke中有很多陷阱,我不认为SWIG可以处理所有这些陷阱。