Mac gcc пытается установить связь со старой несуществующей библиотекой - PullRequest
2 голосов
/ 12 февраля 2011

Я пишу простую программу на C, которая использует библиотеку TagLib. Первоначально я установил библиотеку в / usr / local и скомпилировал и связал свою программу с ней. С тех пор я полностью удалил библиотеку и пытаюсь создать ссылку на скомпилированную версию библиотеки в другом месте. Проблема в том, что когда я сейчас компилирую свою программу, она компилируется чисто, но при попытке ее запустить моя программа ищет библиотеку, которая раньше существовала в / usr / local / lib, а не в новом месте. Например, мой код и новая библиотека TagLib находятся в /Users/mdi/Code/tag.

Я собираю свою программу так:

cc main.c -Wall -I./taglib/bindings/c -o tag -L./taglib/bindings/c/.libs -ltag_c

Как я уже сказал, компиляция завершается без ошибок и предупреждений. Но при попытке запустить двоичный файл я получаю эту ошибку:

dyld: Library not loaded: /usr/local/lib/libtag_c.0.dylib
Referenced from: /Users/mdi/Code/tag/./tag
Reason: image not found
Trace/BPT trap

Запуск 'otool -L' в двоичном файле показывает это:

tag:
/usr/local/lib/libtag_c.0.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.1)

Почему он все еще пытается использовать библиотеку TagLib, которой больше нет даже в / usr / local / lib и, что более важно, как мне это исправить?

Ответы [ 3 ]

2 голосов
/ 12 февраля 2011

Я не занимаюсь разработкой на Mac, но я полагаю, что ваша проблема в том, что ваша библиотека не находится в вашем пути динамической ссылки по умолчанию.Это зависит от платформы, но / usr / local / lib является распространенным среди них, и поэтому он отображается как путь, с которым вы связываетесь во время выполнения.

Вы можете изменить свой путь поиска по умолчанию для библиотек сегментов, но я не уверен, как это сделать на Mac.Вы также должны иметь возможность установить переменную окружения DYLD_LIBRARY_PATH в вашем сеансе, чтобы заставить dyld выполнять поиск в других каталогах перед поиском каталогов по умолчанию.решение переменной среды выше, но я не знаю, как это сделать на Mac.

Редактировать:

После небольшого поискаЯ нашел ссылку , которая вам, скорее всего, покажется полезной.

1 голос
/ 12 февраля 2011

Во-первых, вы уверены, что в / usr / local / bin нет оборванных символических ссылок? Тогда я не знаю, как эта библиотека компилируется / связывается, поэтому я не могу рассказать вам, как это сделать, но вы можете попробовать добавить опцию компоновщика -rpath. Например:

gcc -o libtag_c.0.dylib ... -Wl,-rpath,/Users/mdi/Code/tag

Эта опция добавляет явный путь поиска для библиотеки, и компоновщик времени выполнения будет искать по этому пути библиотеку.

0 голосов
/ 15 февраля 2011

Спасибо за помощь, ребята. На самом деле, к сожалению, ни одно из этих решений не сработало. После еще большего осмотра я заметил, что недавно построенные libs также получают старый путь, как сообщал 'otool -L'. Мне удалось это исправить, используя install_name_tool -id /new/path/to/lib newly_built_lib на библиотеках после того, как они уже были собраны.

Кажется, это решает проблему, но мне все еще любопытно, почему этот старый путь к библиотеке все еще существует, даже после того, как он был полностью удален (без висящих символических ссылок). Я тоже безуспешно пробовал sudo update_dyld_shared_cache -force. Но все равно спасибо за помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...