C ++ dyld: библиотека не загружена - после установки '-L' - PullRequest
2 голосов
/ 19 марта 2020

Сейчас я работаю над простым проектом C ++, но моя ситуация немного сложнее. Я использую библиотеку OpenCV, которую я переместил в папку рядом с моим исходным кодом и сослался на нее из Makefile так же, как pkg-config --cflags --libs opencv4, но просто изменил пути, чтобы они были относительно папки, которую я хочу передать вместе с исходным кодом.

Проблема в том, что после запуска моего Makefile

CC = clang++
CFLAGS = -std=c++17 -g -Wall
SRCS = DisplayImage.cpp
PROG = DisplayImage

OPENCV = -I opencv/include/opencv4/opencv -I opencv/include/opencv4 -L opencv/lib -lopencv_gapi -lopencv_stitching -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_dnn_objdetect -lopencv_dnn_superres -lopencv_dpm -lopencv_highgui -lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hfs -lopencv_img_hash -lopencv_line_descriptor -lopencv_quality -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_sfm -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_superres -lopencv_optflow -lopencv_surface_matching -lopencv_tracking -lopencv_datasets -lopencv_text -lopencv_dnn -lopencv_plot -lopencv_videostab -lopencv_videoio -lopencv_xfeatures2d -lopencv_shape -lopencv_ml -lopencv_ximgproc -lopencv_video -lopencv_xobjdetect -lopencv_objdetect -lopencv_calib3d -lopencv_imgcodecs -lopencv_features2d -lopencv_flann -lopencv_xphoto -lopencv_photo -lopencv_imgproc -lopencv_core
LIBS = $(OPENCV)

$(PROG):$(SRCS)
     $(CC) $(CFLAGS) -o $(PROG) $(SRCS) $(LIBS) 

Где я установил флаг -L. Команда make работает плавно. Но после вызова ./DisplayImage я получаю эту ошибку:

dyld: Library not loaded: /usr/local/opt/opencv/lib/libopencv_gapi.4.2.dylib
  Referenced from: /Users/user/Downloads/Display_Image3/./DisplayImage
  Reason: image not found
Abort trap: 6

Где наиболее важной частью является этот путь /usr/local/opt/opencv/lib/libopencv_gapi.4.2.dylib, который, как я понимаю, путь по умолчанию для библиотек. Я попытался установить DYLD_LIBRARY_PATH и `` LD_LIBRARY_PATH```, но он не сработал так же, и выдал мне ту же ошибку.

Обратите внимание, что мне нужно вызвать библиотеку из указанной папки. Спасибо.

РЕДАКТИРОВАТЬ 19/03/20

Для более подробного описания моей ситуации. Я создал программу на компьютере A с установленным OpenCV, но мне нужно запустить эту программу на компьютере, на котором OpenCV не установлен. Итак, на компьютере A я создавал эту программу с помощью следующей команды:

clang++ -std=c++17 -o DisplayImage DisplayImage.cpp -g -v $(pkg-config --cflags --libs opencv4)

Я взял библиотеку OpenCV из папки, на которую указывал pkg-config --cflags --libs opencv4, переместил ее рядом с моим кодом и переместил весь «репозиторий» на второй компьютер, где я пытаюсь собрать ту же программу с помощью команды:

export DYLD_FALLBACK_LIBRARY_PATH="opencv/lib:$$DYLD_FALLBACK_LIBRARY_PATH" #setting DYLD_FALLBACK_LIB_PATH
clang++ -std=c++17 -g -Wall -o DisplayImage DisplayImage.cpp -I opencv/include/opencv4/opencv -I opencv/include/opencv4 -L opencv/lib -lopencv_gapi -lopencv_stitching -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_dnn_objdetect -lopencv_dnn_superres -lopencv_dpm -lopencv_highgui -lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hfs -lopencv_img_hash -lopencv_line_descriptor -lopencv_quality -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_sfm -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_superres -lopencv_optflow -lopencv_surface_matching -lopencv_tracking -lopencv_datasets -lopencv_text -lopencv_dnn -lopencv_plot -lopencv_videostab -lopencv_videoio -lopencv_xfeatures2d -lopencv_shape -lopencv_ml -lopencv_ximgproc -lopencv_video -lopencv_xobjdetect -lopencv_objdetect -lopencv_calib3d -lopencv_imgcodecs -lopencv_features2d -lopencv_flann -lopencv_xphoto -lopencv_photo -lopencv_imgproc -lopencv_core
#running basically the same command, only replaced $(pkg-config....) with the exact ouput on computer A

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

dyld: Library not loaded: /usr/local/opt/tbb/lib/libtbb.dylib
  Referenced from: /Users/user/Downloads/Display_Image3/opencv/lib/libopencv_gapi.4.2.0.dylib
  Reason: image not found
Abort trap: 6

И это странно, потому что echo $DYLD_FALLBACK_LIBRARY_PATH печатает как исключение opencv/lib:1163DYLD_FALLBACK_LIBRARY_PATH

Так что теперь я должен переместить больше библиотек с компьютера? 1041 * A ? Можно ли как-нибудь найти все те библиотеки, на которые есть ссылки? Или есть ли лучшее решение для всей этой ситуации, вместо того, чтобы заставлять пользователя вручную устанавливать библиотеку opencv?

1 Ответ

0 голосов
/ 19 марта 2020

Как вы сказали в комментариях, вы устанавливаете DYLD_FALLBACK_LIBRARY_PATH в Makefile. Для этого вам, вероятно, потребуется сделать что-то вроде этого:

CC = clang++
CFLAGS = -std=c++17 -g -Wall
SRCS = DisplayImage.cpp
PROG = DisplayImage

OPENCV = -I opencv/include/opencv4/opencv -I opencv/include/opencv4 -L opencv/lib -lopencv_gapi -lopencv_stitching -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_dnn_objdetect -lopencv_dnn_superres -lopencv_dpm -lopencv_highgui -lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hfs -lopencv_img_hash -lopencv_line_descriptor -lopencv_quality -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_sfm -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_superres -lopencv_optflow -lopencv_surface_matching -lopencv_tracking -lopencv_datasets -lopencv_text -lopencv_dnn -lopencv_plot -lopencv_videostab -lopencv_videoio -lopencv_xfeatures2d -lopencv_shape -lopencv_ml -lopencv_ximgproc -lopencv_video -lopencv_xobjdetect -lopencv_objdetect -lopencv_calib3d -lopencv_imgcodecs -lopencv_features2d -lopencv_flann -lopencv_xphoto -lopencv_photo -lopencv_imgproc -lopencv_core
LIBS = $(OPENCV)

$(PROG):$(SRCS)
     $(CC) $(CFLAGS) -o $(PROG) $(SRCS) $(LIBS) 

.PHONY: execute


execute: $(PROG)
     export DYLD_FALLBACK_LIBRARY_PATH="/usr/local/opt/opencv/lib/:$$DYLD_FALLBACK_LIBRARY_PATH" ; \
        $(PROG) $(USER_ARGS)

, а затем сделать его следующим образом:

make execute USER_FLAGS="enter you args here"

В make-файле каждая строка в ваших рецептах выполняется с разными оболочками.

По этой причине это делается так:

export DYLD_FALLBACK_LIBRARY_PATH="/usr/local/opt/opencv/lib/:$$DYLD_FALLBACK_LIBRARY_PATH" ; \
        $(PROG) $(USER_ARGS)

, чтобы сохранить его в одной оболочке.

Вы также можете добиться того же с помощью .ONESHELL:. К сожалению, у меня нет этой функции в моей версии Makefile.

...