pi4j-v2 icon indicating copy to clipboard operation
pi4j-v2 copied to clipboard

pigpio cannot find libpigpio.so.1

Open micartey opened this issue 4 months ago • 1 comments

Hello,

I am on NixOS and had no issues with the linuxfs plugin, but I am forced to use the pigpio provider.

When I run my app, I get the following stacktrace:

[main] ERROR com.pi4j.library.pigpio.util.NativeLibraryLoader - Unable to load/link [libpi4j-pigpio.so] using path: [/lib/aarch64/libpi4j-pigpio.so]
java.lang.UnsatisfiedLinkError: /tmp/libpi4j-pigpio12520870765546861753.so: libpigpio.so.1: cannot open shared object file: No such file or directory
	at java.base/jdk.internal.loader.NativeLibraries.load(Native Method)
	at java.base/jdk.internal.loader.NativeLibraries$NativeLibraryImpl.open(NativeLibraries.java:331)
	at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibraries.java:197)
	at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibraries.java:139)
	at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2418)
	at java.base/java.lang.Runtime.load0(Runtime.java:852)
	at java.base/java.lang.System.load(System.java:2025)
	at com.pi4j.library.pigpio.util.NativeLibraryLoader.loadLibraryFromClasspath(NativeLibraryLoader.java:260)
	at com.pi4j.library.pigpio.util.NativeLibraryLoader.load(NativeLibraryLoader.java:182)
	at com.pi4j.library.pigpio.internal.PIGPIO.<clinit>(PIGPIO.java:74)
	at com.pi4j.library.pigpio.impl.PiGpioNativeImpl.gpioInitialise(PiGpioNativeImpl.java:105)
	at com.pi4j.library.pigpio.PiGpio.initialize(PiGpio.java:159)
	at com.pi4j.plugin.pigpio.provider.pwm.PiGpioPwmProviderImpl.create(PiGpioPwmProviderImpl.java:73)
	at com.pi4j.plugin.pigpio.provider.pwm.PiGpioPwmProviderImpl.create(PiGpioPwmProviderImpl.java:44)
	at com.pi4j.context.Context.create(Context.java:344)
	at com.pi4j.internal.IOCreator.create(IOCreator.java:58)
	at com.pi4j.internal.IOCreator.create(IOCreator.java:116)
	at me.micartey.esc.Main.main(Main.java:19)
Exception in thread "main" java.lang.UnsatisfiedLinkError: Pi4J was unable to extract and load the native library [/lib/aarch64/libpi4j-pigpio.so] from the embedded resources inside this JAR [/home/zero/pwm.jar]. to a temporary location on this system.  You can alternatively define the 'pi4j.library.path' system property to override this behavior and specify the library path.
 UNDERLYING EXCEPTION: [java.lang.UnsatisfiedLinkError]=/tmp/libpi4j-pigpio12520870765546861753.so: libpigpio.so.1: cannot open shared object file: No such file or directory
	at com.pi4j.library.pigpio.util.NativeLibraryLoader.load(NativeLibraryLoader.java:203)
	at com.pi4j.library.pigpio.internal.PIGPIO.<clinit>(PIGPIO.java:74)
	at com.pi4j.library.pigpio.impl.PiGpioNativeImpl.gpioInitialise(PiGpioNativeImpl.java:105)
	at com.pi4j.library.pigpio.PiGpio.initialize(PiGpio.java:159)
	at com.pi4j.plugin.pigpio.provider.pwm.PiGpioPwmProviderImpl.create(PiGpioPwmProviderImpl.java:73)
	at com.pi4j.plugin.pigpio.provider.pwm.PiGpioPwmProviderImpl.create(PiGpioPwmProviderImpl.java:44)
	at com.pi4j.context.Context.create(Context.java:344)
	at com.pi4j.internal.IOCreator.create(IOCreator.java:58)
	at com.pi4j.internal.IOCreator.create(IOCreator.java:116)
	at me.micartey.esc.Main.main(Main.java:19)

My understanding of this is the following:

  1. It fails to find the library on my system
  2. It tries to use the bundled binary instead
  3. The bundled binary fails to find libpigpio.so.1

The issue is, that the binary is present, but in /nix/store/znwyjqbvwx1843z0gr1p0lm4260l4fik-pigpio-79/lib

Is there some way to handle this? Can I set some env variable to set the path?

EDIT I am a linux noob when it comes to native dependency stuff and finding binaries etc.

micartey avatar Oct 12 '25 19:10 micartey

I noticed that the binary does not have the so.1 prefix... So I created a symlink and added the path to LD_LIBRARY_PATH

But now I get the following error:

[main] INFO com.pi4j.runtime.impl.DefaultRuntime - Pi4J context/runtime successfully initialized.
[main] WARN com.pi4j.library.pigpio.impl.PiGpioNativeImpl - PIGPIO ERROR: PI_INIT_FAILED; pigpio initialisation failed
Exception in thread "main" com.pi4j.library.pigpio.PiGpioException: PIGPIO ERROR: PI_INIT_FAILED; pigpio initialisation failed
	at com.pi4j.library.pigpio.impl.PiGpioBase.validateResult(PiGpioBase.java:265)
	at com.pi4j.library.pigpio.impl.PiGpioBase.validateResult(PiGpioBase.java:251)
	at com.pi4j.library.pigpio.impl.PiGpioNativeImpl.gpioInitialise(PiGpioNativeImpl.java:110)
	at com.pi4j.library.pigpio.PiGpio.initialize(PiGpio.java:159)
	at com.pi4j.plugin.pigpio.provider.pwm.PiGpioPwmProviderImpl.create(PiGpioPwmProviderImpl.java:73)
	at com.pi4j.plugin.pigpio.provider.pwm.PiGpioPwmProviderImpl.create(PiGpioPwmProviderImpl.java:44)
	at com.pi4j.context.Context.create(Context.java:344)
	at com.pi4j.internal.IOCreator.create(IOCreator.java:58)
	at com.pi4j.internal.IOCreator.create(IOCreator.java:116)
	at me.micartey.esc.Main.main(Main.java:19)

micartey avatar Oct 13 '25 17:10 micartey