2014-11-07 2 views
1

Я пытаюсь запустить следующий код на MAC OS 10.10:dyld: Символ не найдено: __ZN2cv6imreadERKNSt3 при запуске простого кода на 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.

Я полностью смущен. Есть что-то, что я пропустил?

+0

Как вы говорите компоновщику, какую версию opencv использовать? Я имею в виду, у вас есть обе библиотеки в '/ Users/Coldmoon/MyLibraries/opencv-2.4.9' или только' libC++ 'one? Кроме того, 'libopencv_highgui.2.4.dylib' может иметь путь установки, равный'/usr/local/lib/libopencv_highgui.2.4.dylib', поэтому после того, как вы подключитесь к библиотеке в вашем доме, связанное приложение будет искать библиотеку в другая папка. В качестве первого шага попробуйте запустить приложение с помощью 'DYLD_LIBRARY_PATH =/Users/Coldmoon/MyLibraries/opencv-2.4.9'. – Paul

+0

Спасибо большое! Это сработало! Я просто установил значение DYLD_LIBRARY_PATH' в переменные среды Xcode. Пусть 'DYLD_LIBRARY_PATH =/Пользователи/Coldmoon/MyLibraries/opencv-2.4.9/release/установлены/lib'. Но я все еще не понимаю причину. На мой взгляд, когда я говорю Xcode о позициях «пути поиска заголовка» и «пути поиска библиотеки» (укажите на libC++ opencv, который находится в '/ Users/Coldmoon/MyLibraries/opencv-2.4.9/release/установлен') информация достаточно ясна! Xcode должен знать, какую библиотеку связывать. Почему мне нужно сообщить Xcode значение 'DYLD_LIBRARY_PATH'? – coldmoon

+0

Кстати, 'libstdC++ opencv' находится в'/usr/local/lib', который Xcode имеет тенденцию связывать первоначально. – coldmoon

ответ

2

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.