Z3 Java API не успява да открие libz3.dylib

TL;DR: Наскоро надстроих до по-нова версия на Z3 Java API и сега не мога да заредя libz3java.dylib, защото зависимостта libz3.dylib се игнорира.

Използвам Z3 версия 4.4.1. След като компилирам проекта и поставям libz3java.dylib в java.library.path, получавам следното съобщение за грешка:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no libz3java in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1857)
at java.lang.Runtime.loadLibrary0(Runtime.java:870)
at java.lang.System.loadLibrary(System.java:1119)
at com.microsoft.z3.Native.<clinit>(Native.java:14)
at com.microsoft.z3.Global.ToggleWarningMessages(Global.java:86)

Библиотеката обаче е на правилния път. Когато четете файла Native.java в com.microsoft.z3.jar (генериран автоматично тук), можем да видим, че всъщност извикването System.loadLibrary("z3java"); е неуспешно.

Така че се опитах да заредя библиотеката ръчно:

public static void main(String[] args) {
    System.load("/tmp/z3/build/libz3java.dylib");
}

Резултатът, който получих беше:

Exception in thread "main" java.lang.UnsatisfiedLinkError: /private/tmp/z3/build/libz3java.dylib:
  dlopen(/private/tmp/z3/build/libz3java.dylib, 1): 
    Library not loaded: libz3.dylib
Referenced from: /private/tmp/z3/build/libz3java.dylib
Reason: image not found

Грешката показва, че първо трябва да се зареди libz3.dylib. Затова се опитах да го заредя на ръка.

public static void main(String[] args) {
    System.load("/tmp/z3/build/libz3.dylib");
    System.load("/tmp/z3/build/libz3java.dylib");
}

Неочаквано дава същата грешка. Зареждането на libz3.dylib е успешно, но няма никакъв ефект.

  • Z3: 4.4.1
  • Версия на Java: 1.8.0_25-b17
  • ОС: OSX 10.11.1 (El Capitan)

Благодаря ви много за вашата помощ.


person Eipifi    schedule 05.11.2015    source източник


Отговори (2)


За доклади за грешки, моля, използвайте нашия инструмент за проследяване на проблеми тук. Преди да изпратите грешка обаче, моля, уверете се, че вашият libz3.dylib и вашата инсталация на Java са 64-битови, в противен случай това поведение се случва често и не дава никакви полезни съобщения за грешка, ще изглежда, че натоварването е игнорирано.

person Christoph Wintersteiger    schedule 05.11.2015

Можете да разрешите проблема, като коригирате libz3java.so, за да намерите зависимостта му от същото местоположение с:

patchelf --set-rpath '.:$ORIGIN' libz3java.so

Ако се интересувате от предисторията, можете да прочетете на http://enroute.osgi.org/appnotes/native-libraries.html

А как да инсталирате patchelf е тук: https://installion.co.uk/ubuntu/vivid/universe/p/patchelf/install/index.html

person Balázs Pinke    schedule 12.01.2017