labstreaminglayer / liblsl-Csharp

C# bindings for liblsl

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

DllNotFoundException (Unity builds)

jdevoldere opened this issue · comments

Everything works fine in the editor but when I try to run a build I get the following error:

Fallback handler could not load library C:/Users/Gerbuiker/Documents/Unity Projects/PalletizingTraining/Build/PalletizingTraining_Data/Mono/lsl
Fallback handler could not load library C:/Users/Gerbuiker/Documents/Unity Projects/PalletizingTraining/Build/PalletizingTraining_Data/Mono/lsl.dll
Fallback handler could not load library C:/Users/Gerbuiker/Documents/Unity Projects/PalletizingTraining/Build/PalletizingTraining_Data/Mono/lsl
Fallback handler could not load library C:/Users/Gerbuiker/Documents/Unity Projects/PalletizingTraining/Build/PalletizingTraining_Data/Mono/liblsl
Fallback handler could not load library C:/Users/Gerbuiker/Documents/Unity Projects/PalletizingTraining/Build/PalletizingTraining_Data/Mono/liblsl.dll
Fallback handler could not load library C:/Users/Gerbuiker/Documents/Unity Projects/PalletizingTraining/Build/PalletizingTraining_Data/Mono/liblsl
Fallback handler could not load library C:/Users/Gerbuiker/Documents/Unity Projects/PalletizingTraining/Build/PalletizingTraining_Data/Mono/lsl
Fallback handler could not load library C:/Users/Gerbuiker/Documents/Unity Projects/PalletizingTraining/Build/PalletizingTraining_Data/Mono/lsl.dll
Fallback handler could not load library C:/Users/Gerbuiker/Documents/Unity Projects/PalletizingTraining/Build/PalletizingTraining_Data/Mono/lsl
Fallback handler could not load library C:/Users/Gerbuiker/Documents/Unity Projects/PalletizingTraining/Build/PalletizingTraining_Data/Mono/liblsl
Fallback handler could not load library C:/Users/Gerbuiker/Documents/Unity Projects/PalletizingTraining/Build/PalletizingTraining_Data/Mono/liblsl.dll
Fallback handler could not load library C:/Users/Gerbuiker/Documents/Unity Projects/PalletizingTraining/Build/PalletizingTraining_Data/Mono/liblsl
Fallback handler could not load library C:/Users/Gerbuiker/Documents/Unity Projects/PalletizingTraining/Build/PalletizingTraining_Data/Mono/lsl
Fallback handler could not load library C:/Users/Gerbuiker/Documents/Unity Projects/PalletizingTraining/Build/PalletizingTraining_Data/Mono/lsl.dll
Fallback handler could not load library C:/Users/Gerbuiker/Documents/Unity Projects/PalletizingTraining/Build/PalletizingTraining_Data/Mono/lsl
Fallback handler could not load library C:/Users/Gerbuiker/Documents/Unity Projects/PalletizingTraining/Build/PalletizingTraining_Data/Mono/liblsl
Fallback handler could not load library C:/Users/Gerbuiker/Documents/Unity Projects/PalletizingTraining/Build/PalletizingTraining_Data/Mono/liblsl.dll
Fallback handler could not load library C:/Users/Gerbuiker/Documents/Unity Projects/PalletizingTraining/Build/PalletizingTraining_Data/Mono/liblsl
Fallback handler could not load library C:/Users/Gerbuiker/Documents/Unity Projects/PalletizingTraining/Build/PalletizingTraining_Data/Mono/lsl
Fallback handler could not load library C:/Users/Gerbuiker/Documents/Unity Projects/PalletizingTraining/Build/PalletizingTraining_Data/Mono/lsl.dll
Fallback handler could not load library C:/Users/Gerbuiker/Documents/Unity Projects/PalletizingTraining/Build/PalletizingTraining_Data/Mono/lsl
Fallback handler could not load library C:/Users/Gerbuiker/Documents/Unity Projects/PalletizingTraining/Build/PalletizingTraining_Data/Mono/liblsl
Fallback handler could not load library C:/Users/Gerbuiker/Documents/Unity Projects/PalletizingTraining/Build/PalletizingTraining_Data/Mono/liblsl.dll
Fallback handler could not load library C:/Users/Gerbuiker/Documents/Unity Projects/PalletizingTraining/Build/PalletizingTraining_Data/Mono/liblsl
Fallback handler could not load library C:/Users/Gerbuiker/Documents/Unity Projects/PalletizingTraining/Build/PalletizingTraining_Data/Mono/lsl
Fallback handler could not load library C:/Users/Gerbuiker/Documents/Unity Projects/PalletizingTraining/Build/PalletizingTraining_Data/Mono/lsl.dll
Fallback handler could not load library C:/Users/Gerbuiker/Documents/Unity Projects/PalletizingTraining/Build/PalletizingTraining_Data/Mono/lsl
Fallback handler could not load library C:/Users/Gerbuiker/Documents/Unity Projects/PalletizingTraining/Build/PalletizingTraining_Data/Mono/liblsl
Fallback handler could not load library C:/Users/Gerbuiker/Documents/Unity Projects/PalletizingTraining/Build/PalletizingTraining_Data/Mono/liblsl.dll
Fallback handler could not load library C:/Users/Gerbuiker/Documents/Unity Projects/PalletizingTraining/Build/PalletizingTraining_Data/Mono/liblsl
DllNotFoundException: lsl
  at (wrapper managed-to-native) LSL.liblsl+dll.lsl_create_streaminfo(string,string,int,double,LSL.liblsl/channel_format_t,string)
  at LSL.liblsl+StreamInfo..ctor (System.String name, System.String type, System.Int32 channel_count, System.Double nominal_srate, LSL.liblsl+channel_format_t channel_format, System.String source_id) [0x00006] in <4c7d1dc916234004b4e8304c52f0b307>:0 
  at EyeManager.InitializeStreams () [0x00000] in <798e751aa0fb41c3a99e7caeebe38595>:0 
  at EyeManager.Start () [0x0001a] in <798e751aa0fb41c3a99e7caeebe38595>:0 
 
(Filename: <4c7d1dc916234004b4e8304c52f0b307> Line: 0)

It is looking for the DLL inside /PalletizingTraining_Data/Mono/ but this folder doesn't even exist.
Instead it is located inside of \PalletizingTraining_Data\Plugins folder and is called liblsl64.dll rather than liblsl.dll or lsl.dll.
So as a work around I have to create a Mono folder and copy-paste the DLL in there from the Plugins folder and rename it before it works.

Why is this?

You're sort of caught in a limbo period. Currently liblsl is still officially on 1.13 and uses library naming conventions which aren't typical for Windows (i.e., lib prefix and 64 suffix), but liblsl 1.14 modernizes library naming (just lsl.dll) and liblsl-Csharp has been updated to expect modern library naming. C# has facilities to find libraries automatically, across platforms, as long as they use expected naming conventions. So this makes things quite a bit easier for us, eventually, once everyone is on liblsl 1.14.

So you can work off the 1.14 liblsl pre-release: https://github.com/sccn/liblsl/releases/tag/v1.14.0b3

That answers the library naming question.

As for the folder name, I'm not sure. What platform are you targeting for your builds? Windows, Mac, Android, other? 32/64?

@cboulay Folder issue aside, oddly enough I get DllNotFoundException: liblsl64 inside of the editor when I rename it to liblsl.dll yet in the build it expects it the other way around.

I was using the 1.14 pre-release at first but had to switch to the 1.13 release due to some breaking bug. I might open up a ticket about this later but it's hard to reproduce.

I'm targeting Windows 64 and have made sure my build and plugin settings correspond.

(sorry for slow turnaround, was in a meeting).

Please open a ticket about the 1.14 bug even if you don't know exactly how to reproduce it.
Edit: Never mind, I see you did: sccn/liblsl#82

oddly enough I get DllNotFoundException: liblsl64 inside of the editor when I rename it to liblsl.dll yet in the build it expects it the other way around.

Another consequence of this limbo thing. Sorry. I guess I had changed the liblsl-finding code on my system but I didn't update it here because I knew not everyone would be on 1.14 yet. The old lib-finding code is still there, but obviously incomplete.

In this block,

#if (UNITY_EDITOR_LINUX && UNITY_EDITOR_64)
            const string libname = "liblsl64.so";
#elif UNITY_EDITOR_LINUX
            const string libname = "liblsl32.so";
#elif (UNITY_EDITOR_WIN && UNITY_EDITOR_64)
            const string libname = "liblsl64";
#elif UNITY_EDITOR_WIN
            const string libname = "liblsl32";
#elif UNITY_ANDROID
            const string libname = "lslAndroid";
#else
            // Name of the binary to include -- replace this if the native library has a differentname
            const string libname = "lsl";
#endif

you can delete it all and replace it with just the last line, without the #if / #endif:
const string libname = "lsl";

If 1.14 doesn't work for you and you need to use 1.13, then change that string to "liblsl64".

(sorry for slow turnaround, was in a meeting).

@cboulay no worries. You follow up on issues a lot faster than most and can't forget that you have a life of your own.

Your advice somehow also got rid of the folder issue so closing this now.