Я пытаюсь запустить следующий код на MAC OS 10.10:
#include <cv.h>
#include <highgui.h>
using namespace std;
using namespace cv;
int main()
{
Mat img = imread("xxx.jpg");
imshow("image", img);
waitKey(0);
return 0;
}
Этот код может быть успешно построен. Но когда я запускаю его, я всегда получаю сообщение об ошибке:
dyld: lazy symbol binding failed: Symbol not found:
__ZN2cv6imreadERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEEi
Referenced from:
/Users/Coldmoon/ComputerVisionApps/opencvTest/Build/Products/Debug/opencvTest
Expected in: /usr/local/lib/libopencv_highgui.2.4.dylib
У меня есть две разные версии opencv. Один построен с libstdc++
другой построен с libc++
, Оба opencv 2.4.9. Я хочу построить вышеуказанный код, используя libc++
OpenCV.
Итак, в Xcode 6.1 я установил Header Search Path
а также Library Search Path
указать на libc++
OpenCV, который находится в /Users/Coldmoon/MyLibraries/opencv-2.4.9
и установить C++ Standard Library
в libc++
,
Мой вопрос: кажется, что компилятор не связывает libc++
но opencv libstdc++
OpenCV вместо того, который находится в /usr/local/lib
,
Я полностью сбит с толку. Я что-то пропустил?
Library Search Paths
сообщает компоновщику, где искать библиотеку для ссылки. Но когда исполняемый файл запущен, библиотека может искать динамический загрузчик (dyld
) в разных местах. Это контролируется «Install Name» библиотеки, которая может быть запрошена otool -D libFoo.dylib
,
Так, например, если библиотека, на которую вы ссылаетесь, находится в /bar/libFoo.dylib
, но его имя установки /baz/libFoo.dylib
нужно поставить /bar
в Library Search Paths
, но когда вы запустите бинарный файл, он будет найден в /baz
,
Вы также можете узнать, где находятся библиотеки, когда исполняемый файл запускается otool -L <executable>
,
Если путь к разделяемой библиотеке не является абсолютным, динамический загрузчик пытается загрузить его из некоторых стандартных путей. Если вы установите DYLD_PRINT_LIBRARIES
переменная окружения, dyld
будет записывать имена файлов библиотек, в которые он пытается загрузить stderr
, Вы можете переопределить пути, где dyld
ищет библиотеки, установив DYLD_LIBRARY_PATH
переменная (:
разделенный список путей).
Подробнее о dyld
переменные среды можно найти в man dyld
,