Развертывание qt5 с помощью opencv, как исправить пути установки lib?

Аналогичная проблема частично решена здесь dyld: библиотека не загружена: lib/libopencv_core.3.0.dylib Причина: изображение не найдено, что приводит к решению там, которые у меня не работают.

Я использую Qt 5 с openCV 3 с Mac OS X 10.10.5. Когда я использую macdeployqt, этот процесс не имеет правильных путей для файлов openCV .dylib. Он жалуется на:

ERROR: no file at "/lib/libopencv_core.3.0.dylib"
ERROR: no file at "/lib/libopencv_highgui.3.0.dylib"
ERROR: no file at "/lib/libopencv_imgproc.3.0.dylib"

который относится к неправильным путям к файлам, заданным как относительные, но интерпретируемые как абсолютные, в соответствии с:

$ otool -L myApp.app/Contents/MacOS/myApp 
myApp.app/Contents/MacOS/myApp:

(...)

    lib/libopencv_core.3.0.dylib (compatibility version 3.0.0, current version 3.0.0)
    lib/libopencv_highgui.3.0.dylib (compatibility version 3.0.0, current version 3.0.0)
    lib/libopencv_imgproc.3.0.dylib (compatibility version 3.0.0, current version 3.0.0)

(...)

И, конечно же, приложение вылетает при запуске на другом компьютере, жалуясь на отсутствующие библиотеки выше.

Как я могу это исправить, учитывая, что упомянутое выше решение не сработало? Или как я могу «лучше» применить решение выше в этом случае? (Возможно, я не адаптировал их должным образом).

Я пробовал 3 разные установки opencv 3: CMake, homebrew и macports. Проблема осталась идентичной.


person Wall-E    schedule 10.12.2015    source источник
comment
Другой неработающий обходной путь: я попытался использовать статическую библиотеку, щелкнув правой кнопкой мыши внутри файла .pro, чтобы добавить библиотеки. Итак, я получаю, например: macx: LIBS += -L$$PWD/../opencv3_build_static/lib/ -lopencv_core INCLUDEPATH += $$PWD/../opencv3_build_static/include DEPENDPATH += $$PWD/../opencv3_build_static/include macx: PRE_TARGETDEPS += $$PWD/../opencv3_build_static/lib/libopencv_core.a Тем не менее, macdeployqt выдает ту же ошибку, ища .dylib внутри /lib/... Это вообще не имеет смысла.   -  person Wall-E    schedule 11.12.2015


Ответы (1)


Добрая душа на работе помогла мне лучше понять, как я могу адаптировать приведенные выше решения, использующие файл install_name_tool. Поскольку приведенные выше решения не сработали в моем случае, вот сценарий с комментариями, подробно описывающими каждый шаг. Этот сценарий предполагает, что вы уже использовали macdeployedqt и получили файл .app. Это исправление работает с opencv 3 при связывании библиотек opencv_core, opencv_highgui и opencv_imgproc. В вашем случае вам нужно изменить LIB_DIR и APP_DIR на (соответственно) каталог, в котором находятся ваши файлы библиотеки opencv (.dylib), и путь к вашему пакету .app (здесь мое приложение называется Qtfits_openmp). Конечно, из этого можно сделать более компактный сценарий, но я надеюсь, что подробные шаги помогут каждому адаптироваться к его/ее собственному случаю.

#! /bin/bash

LIB_DIR=~/Dev/opencv3_tbb_opencl/lib
APP_DIR=~/Dev/build-Qtfits_openmp-clang_omp-Release/Qtfits_openmp.app
# This script supposes here that you are in the parent directory of the app.

# check to what libs your app is "explicitly" linked to with otool -L $APP_DIR/Contents/MacOS/Qtfits_openmp
# If originally linking with LIBS += -lopencv_core -lopencv_highgui -lopencv_imgproc, you'd need to copy them in the .app with their dependencies.
# However, opencv has the path of symbolic links, ending with 3.0. , so we need to copy the actual files, i.e., with the whole version number 3.0.0. 
cp $LIB_DIR/libopencv_core.3.0.0.dylib $APP_DIR/Contents/Frameworks/libopencv_core.3.0.0.dylib
cp $LIB_DIR/libopencv_highgui.3.0.0.dylib $APP_DIR/Contents/Frameworks/libopencv_highgui.3.0.0.dylib
cp $LIB_DIR/libopencv_imgproc.3.0.0.dylib $APP_DIR/Contents/Frameworks/libopencv_imgproc.3.0.0.dylib
# Extra dependencies exist: otool -L libopencv_* will show you all the dependencies that you need to copy.
# Here we will also need to add imgcodecs and videoio to the .app
cp $LIB_DIR/libopencv_imgcodecs.3.0.0.dylib $APP_DIR/Contents/Frameworks/libopencv_imgcodecs.3.0.0.dylib
cp $LIB_DIR/libopencv_videoio.3.0.0.dylib $APP_DIR/Contents/Frameworks/libopencv_videoio.3.0.0.dylib


# With otool -L $APP_DIR/Contents/MacOS/yourApp , look at the .lib files with a wrong path. With the following result:
#   lib/libopencv_core.3.0.dylib (compatibility version 3.0.0, current version 3.0.0)
#   lib/libopencv_highgui.3.0.dylib (compatibility version 3.0.0, current version 3.0.0)
#   lib/libopencv_imgproc.3.0.dylib (compatibility version 3.0.0, current version 3.0.0)

# we need to fix the 3 libraries core, highgui and imgproc which are given here with an incorrect relative path. 
# Note that again, opencv kept the basename of the symbolic links (ending with 3.0.dylib), not the basename of the actual files (ending with 3.0.0.dylib)
# So we have to keep things consistent with what we did above. 

install_name_tool -change lib/libopencv_core.3.0.dylib @executable_path/../Frameworks/libopencv_core.3.0.0.dylib $APP_DIR/Contents/MacOS/Qtfits_openmp
install_name_tool -change lib/libopencv_highgui.3.0.dylib @executable_path/../Frameworks/libopencv_highgui.3.0.0.dylib $APP_DIR/Contents/MacOS/Qtfits_openmp
install_name_tool -change lib/libopencv_imgproc.3.0.dylib @executable_path/../Frameworks/libopencv_imgproc.3.0.0.dylib $APP_DIR/Contents/MacOS/Qtfits_openmp

# Now we need to fix the path to all the dependencies of each library file.
cd $APP_DIR/Contents/Frameworks

# Change the IDs
for i in libopencv*.dylib; do install_name_tool -id @executable_path/../Frameworks/$i $i; done

# Again, with otool -L libopencv_* , you will see that you need to change their paths so that your copied libraries are pointed to within the app.
# for each opencv lib that is not properly referenced, change it from the absolute or wrong-relative path to @executable_path/../Frameworks/

# fix libopencv_highgui
install_name_tool -change $LIB_DIR/libopencv_imgcodecs.3.0.dylib @executable_path/../Frameworks/libopencv_imgcodecs.3.0.0.dylib libopencv_highgui.3.0.0.dylib
install_name_tool -change $LIB_DIR/libopencv_core.3.0.dylib @executable_path/../Frameworks/libopencv_core.3.0.0.dylib libopencv_highgui.3.0.0.dylib
install_name_tool -change $LIB_DIR/libopencv_imgproc.3.0.dylib @executable_path/../Frameworks/libopencv_imgproc.3.0.0.dylib libopencv_highgui.3.0.0.dylib
install_name_tool -change $LIB_DIR/libopencv_videoio.3.0.dylib @executable_path/../Frameworks/libopencv_videoio.3.0.0.dylib libopencv_highgui.3.0.0.dylib

# fix libopencv_imgproc 
install_name_tool -change $LIB_DIR/libopencv_core.3.0.dylib @executable_path/../Frameworks/libopencv_core.3.0.0.dylib libopencv_imgproc.3.0.0.dylib

# fix libopencv_videoi
install_name_tool -change $LIB_DIR/libopencv_imgcodecs.3.0.dylib @executable_path/../Frameworks/libopencv_imgcodecs.3.0.0.dylib libopencv_videoio.3.0.0.dylib
install_name_tool -change $LIB_DIR/libopencv_imgproc.3.0.dylib @executable_path/../Frameworks/libopencv_imgproc.3.0.0.dylib libopencv_videoio.3.0.0.dylib
install_name_tool -change $LIB_DIR/libopencv_core.3.0.dylib @executable_path/../Frameworks/libopencv_core.3.0.0.dylib libopencv_videoio.3.0.0.dylib

# fix libopencv_imgcodecs
install_name_tool -change $LIB_DIR/libopencv_imgproc.3.0.dylib @executable_path/../Frameworks/libopencv_imgproc.3.0.0.dylib libopencv_imgcodecs.3.0.0.dylib
install_name_tool -change $LIB_DIR/libopencv_core.3.0.dylib @executable_path/../Frameworks/libopencv_core.3.0.0.dylib libopencv_imgcodecs.3.0.0.dylib
person Wall-E    schedule 11.12.2015