Почему я не могу загрузить dylib?

Вот команда, которую я набрал:

clang++ -Iboost -Ijpeg_lib/include/ -Ljpeg_lib/lib/ -ljpeg.9 mandelbrot.cpp

Структура каталогов такая:

mandelbrot.cpp
/boost
/jpeg_lib/lib/
    libjpeg.9.dylib
/jpeg_lib/include/

Компиляция проходит успешно, но при запуске бинарного файла возникает ошибка:

dyld: библиотека не загружена: /usr/local/lib/libjpeg.9.dylib

Ссылка из: /Users/hanxu/Documents/./a.out

Причина: изображение не найдено

Ловушка трассировки/BPT: 5

Я указал путь поиска библиотеки к jpeg_lib/include/, почему программа все еще ищет в /usr/local/lib?


person HanXu    schedule 28.04.2013    source источник
comment
Эта точка в /Users/hanxu/Documents/./a.out мне кажется очень странной.   -  person Michael Dautermann    schedule 28.04.2013
comment
@MichaelDautermann, я только что скопировал результат командной строки. Я использую ./a.out для запуска своей программы. мне тоже странно..   -  person HanXu    schedule 28.04.2013
comment
это инструмент командной строки, который вы создаете проект Xcode, или это через Makefile?   -  person Michael Dautermann    schedule 28.04.2013
comment
@MichaelDautermann, Makefile, я скачал отсюда: ijg.org   -  person HanXu    schedule 28.04.2013
comment
является ли libjpeg.9.dylib в /jpeg_lib/lib реальным файлом или это (неработающая) символическая ссылка на /usr/local/lib?   -  person Michael Dautermann    schedule 28.04.2013
comment
@MichaelDautermann, я считаю, что это настоящий файл. Он генерируется через make install из IJG.   -  person HanXu    schedule 28.04.2013
comment
@MichaelDautermann, в /jpeg_lib/lib есть два файла, один из которых - libjpeg.9.dylib, настоящий файл. Другой — libjpeg.dylib, который, я думаю, является символической ссылкой, потому что в левом нижнем углу есть маленькая стрелка.   -  person HanXu    schedule 28.04.2013
comment
@MichaelDautermann, я понял. Я указал путь для компиляции. Но после компиляции программа будет искать файл динамической библиотеки по указанному системой пути. Поэтому мне нужно скопировать файл .dylib в /usr/local/lib...   -  person HanXu    schedule 28.04.2013


Ответы (2)


Вы должны указать каталог, в котором libjpeg.9.dylib находится в LD_LIBRARY_PATH, что необходимо для поиска библиотек во время выполнения:

export LD_LIBRARY_PATH=/path/to/libjpeg

person Kenneth Hoste    schedule 20.05.2013
comment
LD_LIBRARY_PATH это Linux (UNIX), под OSX это DYLD_LIBRARY_PATH. - person trojanfoe; 20.05.2013

Вы проверили разрешения на свой jpeg_lib? Если вы установили то, что вы запускаете как root, а затем запустили как себя, это могло произойти.

У меня было то же сообщение об ошибке при запуске графики GD из Perl cgi после установки портманто от имени пользователя root, и я обнаружил, что каталог /usr/local/lib, в котором находится мой libjpeg.9.dylib, имеет разрешения 700. Изменение на 755 (например, все остальные каталоги в /usr/local) решили проблему.

person David    schedule 06.05.2014