#linux #gcc #shared-libraries
Вопрос:
Я пытаюсь скомпилировать/связать очень старую часть программного обеспечения в системе Linux, и по какой-то причине я не могу связать ее с общей библиотекой, установленной в моей системе.
Я получаю следующую ошибку от компоновщика:
/usr/bin/ld: cannot find -lXaw
Однако сама библиотека установлена. Если я побегу
ldconfig -v | grep libXaw
Я получаю (среди прочего) этот хит:
libXaw.so.7 -> libXaw7.so.7.0.0
Библиотека и ссылки на нее находятся в /usr/lib, кстати. Так что ничего особенного.
Итак, библиотека есть, и ldconfig находит ее. Что может привести к тому, что ld не найдет библиотеку во время соединения? Как вы, возможно, уже догадались, я совершенно новичок в работе с общей библиотекой.
Есть какие-нибудь идеи?
Ответ №1:
Компоновщик может буквально искать «libXaw.so». Это в /usr/lib? Если нет, вы можете попробовать добавить его в качестве другой мягкой ссылки из libXaw7.so.7.0.0.
Комментарии:
1. Спасибо, эта ссылка исправила это. У вас есть какие-нибудь идеи, почему это необходимо в первую очередь? Другие библиотеки с аналогичными схемами именования работают без проблем.
2. Обычно символическая ссылка .so предоставляется в пакете разработки в большинстве дистрибутивов (например, libxaw-dev). Может ли это быть вашим делом?
3. Можете ли вы привести конкретный пример? Как в: Я нормально связываюсь с-lfoo, но нет libfoo.so или libfoo.a в моей системе, только libfoo.so.1.0.
Ответ №2:
Причина символической ссылки, кстати, заключается в выборе версии по умолчанию для ссылки.В случае нескольких версий имейте в виду, что имя библиотеки интегрировано в двоичный файл. (что вы можете видеть с помощью ldd).
Ответ №3:
Переопределяются ли каталоги библиотеки-L, и она не ищет в /usr/lib?
Ответ №4:
Чтобы связать его, вам нужен файл .a, а НЕ файл .so, который является библиотекой времени выполнения. Общий объект полезен только для программы, уже связанной с разделяемыми частями библиотеки. Обычно это распространяется в файле «.a».
Комментарии:
1. Хм, это может быть верно в Windows, но в Linux вы обычно ссылаетесь на саму общую библиотеку.
2. путаница, вероятно, связана с тем фактом, что
.lib
используется для обозначения как статических, так и импортных библиотек (последние, как я понимаю, являются «прокси» для общих библиотек во время ссылок).