проблемы с общей библиотекой в linux

#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 используется для обозначения как статических, так и импортных библиотек (последние, как я понимаю, являются «прокси» для общих библиотек во время ссылок).