1

ゴール:

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);
4

2 に答える 2

0

実際に Unity で使用しているのに、なぜ so ファイルを mono でテストするのですか?

Mono: ライブラリ 'C:\Users\fgera\Development\Tools\CMUSphinx\pocketsphinx\swig\csharp\libpocketsphinxwrap.so.dll' の読み込み中に DllImport エラーが発生しました: '指定されたファイルが見つかりません。

ファイルlibpocketsphinxwrap.soが に存在する場合は、モノが見つけられるように名前をC:\Users\fgera\Development\Tools\CMUSphinx\pocketsphinx\swig\csharp\変更してみlibpocketsphinxwrap.soてください。libpocketsphinxwrap.so.dll

mono pinvoke: ライブラリ名およびDllNotfoundExceptionも参照してください。


公式にサポートされているため、Visual Studio で Pocketphinx をビルドしてみることができます。

ところで、P/Invoke には多くのトラップがあり、SWIG がそれらすべてを処理できるとは思わないため、SWIG を使用する代わりに C# ラッパーを自分で作成したいと思います。

于 2017-08-06T05:28:52.550 に答える