System.DllNotFoundException 在 pocketsphinx swig Unity windows build
System.DllNotFoundException in pocketsphinx swig Unity windows build
目标:
在 Windows 的 Unity 项目中获取包装器 dll 以使用 pocketsphinx。
问题:
当 运行 运行测试程序时,即使 .so 文件与 mono 程序位于同一目录中,我也会感到恼火 System.DllNotFoundException
。
设置和尝试的操作:
首先,我使用的是 Cygwin。我能够构建绝对的一切,sphinxbase 和 pocketsphinx 没问题。然后我进入 swig/csharp 目录并尝试制作。它确实创建了一个 .so 文件。我在 cygwin 中使用默认的 Makefile 和 make。规则 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 $@
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 文件在同一目录中,肯定会被查看,因为当 运行ning mono with 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.
很多次了。
任何帮助将不胜感激。同样,我需要 libpocketsphinx.so x86_64 for windows 在 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);
为什么用mono测试so文件,而它实际上在Unity中使用?
Mono: DllImport error loading library 'C:\Users\fgera\Development\Tools\CMUSphinx\pocketsphinx\swig\csharp\libpocketsphinxwrap.so.dll': 'The system cannot find the file specified.
如果文件 libpocketsphinxwrap.so
确实存在于 C:\Users\fgera\Development\Tools\CMUSphinx\pocketsphinx\swig\csharp\
中,请尝试将 libpocketsphinxwrap.so
重命名为 libpocketsphinxwrap.so.dll
以便单声道可以找到它。
另见 mono pinvoke: library names and DllNotfoundException。
您可以尝试使用 Visual Studio 构建 pocketsphinx,因为 it is offically supported。
顺便说一句,我宁愿自己编写 C# 包装器而不是使用 SWIG,因为 P/Invoke 中有很多陷阱,我认为 SWIG 无法处理所有这些。
我怀疑 Cygwin DLL 是否与 Mono/Unity 兼容。您需要在 Visual Studio 中创建 DLL,然后才能运行。
目标:
在 Windows 的 Unity 项目中获取包装器 dll 以使用 pocketsphinx。
问题:
当 运行 运行测试程序时,即使 .so 文件与 mono 程序位于同一目录中,我也会感到恼火 System.DllNotFoundException
。
设置和尝试的操作:
首先,我使用的是 Cygwin。我能够构建绝对的一切,sphinxbase 和 pocketsphinx 没问题。然后我进入 swig/csharp 目录并尝试制作。它确实创建了一个 .so 文件。我在 cygwin 中使用默认的 Makefile 和 make。规则 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 $@
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 文件在同一目录中,肯定会被查看,因为当 运行ning mono with 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.
很多次了。
任何帮助将不胜感激。同样,我需要 libpocketsphinx.so x86_64 for windows 在 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);
为什么用mono测试so文件,而它实际上在Unity中使用?
Mono: DllImport error loading library 'C:\Users\fgera\Development\Tools\CMUSphinx\pocketsphinx\swig\csharp\libpocketsphinxwrap.so.dll': 'The system cannot find the file specified.
如果文件 libpocketsphinxwrap.so
确实存在于 C:\Users\fgera\Development\Tools\CMUSphinx\pocketsphinx\swig\csharp\
中,请尝试将 libpocketsphinxwrap.so
重命名为 libpocketsphinxwrap.so.dll
以便单声道可以找到它。
另见 mono pinvoke: library names and DllNotfoundException。
您可以尝试使用 Visual Studio 构建 pocketsphinx,因为 it is offically supported。
顺便说一句,我宁愿自己编写 C# 包装器而不是使用 SWIG,因为 P/Invoke 中有很多陷阱,我认为 SWIG 无法处理所有这些。
我怀疑 Cygwin DLL 是否与 Mono/Unity 兼容。您需要在 Visual Studio 中创建 DLL,然后才能运行。