dyld: символ не найден: __ZN2cv6imreadERKNSt3 при запуске простого кода в MAC OS 10.10

Я пытаюсь запустить следующий код на 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,

Я полностью сбит с толку. Я что-то пропустил?

1

Решение

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,

2

Другие решения


По вопросам рекламы [email protected]