проблемы связи ld:/usr/bin/ld: не может найти [libraryname]

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

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

проект B был успешно создан.

в .pro файле для проекта A мой ОСВОБОЖДАЕТ переменную, похож на это:

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

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

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

/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 (символьная ссылка)
  • libdatelib_release.so.1.0 (символьная ссылка)
  • libdatelib_release.so.1.0.0 (совместно использованный lib)

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

5
задан Stick it to THE MAN 19 February 2010 в 11:08
поделиться

3 ответа

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

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

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

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

9
ответ дан 13 December 2019 в 05:34
поделиться

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

LIBS += -L../datelib/bin -ldatelib_release.so.1.0.0
3
ответ дан 13 December 2019 в 05:34
поделиться

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

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

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

0
ответ дан 13 December 2019 в 05:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: