Search code examples
unity-game-enginemonoswigpocketsphinxdllnotfoundexception

System.DllNotFoundException in pocketsphinx swig Unity windows build


Goal:

Obtain a wrapper dll to use pocketsphinx in a Unity project in Windows.

Problem:

When running the test program, I get an annoying System.DllNotFoundException even though the .so file is in the same directory as the mono program.

Setup and attempted actions:

For starters, I am using Cygwin. I was able to build absolutely everything, sphinxbase and pocketsphinx no problem. Then I went into the swig/csharp directory and attempted make. It does make, a .so file is created. I am using the default Makefile and make in cygwin. Rules 1-3 run perfectly fine, building, linking and everything. So does the pocketsphinx_continuous test.

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

When attempting mono test.exe - the following happens:

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

The .so is in the same directory as the test.exe file and is certainly being looked at because when running mono with MONO_LOG_LEVEL=debug, the output is:

Mono: DllImport error loading library 'C:\Users\fgera\Development\Tools\CMUSphinx\pocketsphinx\swig\csharp\libpocketsphinxwrap.so.dll': 'The system cannot find the file specified.

Many times over and over.

Any help will be greatly appreciated. Again, I need a libpocketsphinx.so x86_64 for windows in Unity to interop with the C# files.

Thanks.

--- edit - added relevant snippet. test.cs just calls this method from the wrapper data structure. These files were all generated by 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);

Solution

  • I doubt Cygwin DLL is compatible with Mono/Unity. You need to create DLL in Visual Studio, then it will work.