ImportError: библиотека не загружена, путаница в связывании dyld

#python #linker #macos-catalina #py2app #dyld

#python #компоновщик #macos-catalina #py2app #dyld

Вопрос:

Итак, я пытаюсь использовать Py2app для экспорта скрипта python, который использует tkinter и записывает в Excel, и я получаю эту ошибку;

 ImportError: dlopen(/Users/James/Documents/Python/Projects/Budget/dist/automating_finances0.app/Contents/Resources/lib/python3.8/lib-dynload/PIL/_imaging.so, 2): 
Library not loaded: @loader_path/.dylibs/libopenjp2.2.3.1.dylib
  Referenced from: /Users/James/Documents/Python/Projects/Budget/dist/automating_finances0.app/Contents/Resources/lib/python3.8/lib-dynload/PIL/_imaging.so
  Reason: image not found
  

Когда я otool -L включаю contents/macOS/automating_finances0 , я получаю это;

 /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 21.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)
    /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 283.0.0)
    /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1151.16.0)
  

Я исследовал @loader_path, @rpath и ссылки на dyld, но, похоже, не могу понять это. Я не уверен, почему мое приложение ищет зависимости в папках выше, а не myapp/contents/frameworks etc в том, где libopenjp2.2.3.1.dylib находится? Я попытался изменить пути поиска, выполнив;

 install_name_tool -change /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa Users/James/Documents/Python/Projects/Budget/dist/automating_finances0.app/Contents/frameworks Users/James/Documents/Python/Projects/Budget/dist/automating_finances0.app/Contents/macOS/automating_finances0
  

но это абсолютно не работает, я не совсем уверен, что такое Cocoa? Новичок, поэтому любая помощь очень ценится.

Ответ №1:

Оказывается, я искал не в том месте, ошибка была с _imaging.so . Я не учел это, потому что не распознал файл .so как динамическую библиотеку. Использование otool -L _imaging.so показало отсутствующие зависимости и bingo, которые они включали libopenjp2.2.3.1.dylib в себя среди прочих. В итоге я просто скопировал содержимое myapp/contents/frameworks to usr/local/lib , которое, похоже, работает нормально, хотя это не похоже на надежное решение.