ゴール:
Windows の Unity プロジェクトで pocketphinx を使用するためのラッパー dll を取得します。
問題:
テスト プログラムを実行するとSystem.DllNotFoundException
、.so ファイルが mono プログラムと同じディレクトリにあるにもかかわらず、迷惑なメッセージが表示されます。
セットアップと試行されたアクション:
まず、Cygwin を使用しています。私は絶対にすべてを構築することができました.sphinxbaseとpokesphinxは問題ありません. 次に、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: DllImport error loading library 'C:\Users\fgera\Development\Tools\CMUSphinx\pocketsphinx\swig\csharp\libpocketsphinxwrap.so.dll': 'The system cannot find the file specified.
何度も何度も。
どんな助けでも大歓迎です。繰り返しますが、Unity のウィンドウが C# ファイルと相互運用するには、libpocketsphinx.so x86_64 が必要です。
ありがとう。
--- 編集 - 関連するスニペットを追加しました。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);