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 (Эль-Капитан)

Большое спасибо за Вашу помощь.


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