Проблемы с связью ld: / usr / bin / ld: не удается найти [имя библиотеки] - PullRequest
5 голосов
/ 18 февраля 2010

Я использую Qmake для создания общей библиотеки в Ubuntu 9.10

Эта общая библиотека (A) зависит от другой общей библиотеки (B).

Проект B был успешно построен.

в файле .pro для проекта A моя переменная LIBS выглядит следующим образом:

LIBS += -L../datelib/bin -llibdatelib_release.so.1.0.0

(Я использовал полное имя shlib, потому что версии библиотек разные.)

В любом случае, когда я пытаюсь построить проект A, он разрывается на этапе связывания и печатает сообщение об ошибке:

/usr/bin/ld: cannot find -llibdatelib_release.so.1.0.0
collect2: ld returned 1 exit status
make[1]: ***[bin/libprojecta_release.so.6.0.0] Error 1
make ***[release] Error 2
Exited with code 2

Из сообщения об ошибке я подумал, что ld жалуется, что не может найти файл libdatelib, поэтому я вручную скопировал его в / usr / lib /

однако, это не решило проблему, и я получаю то же сообщение об ошибке.

Кто-нибудь знает, как это исправить?

[Изменить]

Я довольно новичок в построении с использованием gcc. Я знаю, как создавать символические ссылки, но какие пути я использую для команды lnk? Файл, на который я хочу сослаться, находится в /home/username/work/cppdev/datelib/bin.

Также система сборки, которую я использую (qmake), автоматически создает символические ссылки как часть сборки, поэтому у меня уже есть следующие файлы в моей папке / home / username / work / cppdev / datelib / bin:

  • libdatelib_release.so (символьная ссылка)
  • libdatelib_release.so.1 (sym link)
  • libdatelib_release.so.1.0 (sym link)
  • libdatelib_release.so.1.0.0 (общая библиотека)

Возможно, мне придется задать другой вопрос, чтобы объяснить, почему существует так много символических ссылок (в чем смысл?), И почему я не могу просто ссылаться непосредственно на разделяемую библиотеку, но должен пройти через символическую ссылку. Я читал некоторые онлайн-документы, но то, что я видел до сих пор, больше похоже на изречение / традицию, а не на реальные технические причины. ПОЧЕМУ этот уровень абстракции необходим при линковке в Linux.

Ответы [ 3 ]

9 голосов
/ 18 февраля 2010

Вы не можете использовать -l таким образом. -l может найти вещи только с такими именами, как libFOO.so, через -lFOO. Вам нужна символическая ссылка без номера версии, если вы хотите указать ее в сборке следующим образом.

Что-то вроде:

ln -s /the/path/to/the/libthing.so.1.0.0 /the/path/to/the/libthing.so

Теперь все будет работать.

3 голосов
/ 18 февраля 2010

Префикс 'lib' автоматически добавляется к имени библиотеки - используйте:

LIBS += -L../datelib/bin -ldatelib_release.so.1.0.0
0 голосов
/ 18 февраля 2010

Вы можете указать полный путь. т.е.

LIBS += ../datelib/bin/libdatelib_release.so.1.0.0

Однако я бы порекомендовал вам сделать то, что предложил bmargulies: создать символическую ссылку и добавить -ldatelib_release

...