Почему компоновщик GNU не находит общий объект с -l <library>? - PullRequest
5 голосов
/ 09 марта 2011

Я получаю сообщение об ошибке при попытке связать объектный файл:

$ g++ -o intro intro.o -L -Wl,-rpath-link  -lnotes -lm -lnsl -lpthread -lc -lresolv -ldl
/usr/bin/ld: cannot find -lnotes
collect2: ld returned 1 exit status

Однако, библиотека, кажется, там (на самом деле, я поместил ее туда, включив /opt/ibm/lotus/notes в файлв /etc/ld.so.conf.d/ и работает ldconfig):

$ ldconfig --print-cache | grep libnotes                                                      
361:    libnoteswc.so (libc6) => /opt/ibm/lotus/notes/libnoteswc.so
362:    libnotes.so (libc6) => /opt/ibm/lotus/notes/libnotes.so

Почему не удается установить связь и как заставить компоновщик использовать эти общие объекты?

Ответы [ 2 ]

1 голос
/ 09 марта 2011

Попробуйте с флагом -L для ld.Пример одного из моих Makefile:

CFLAGS=-c -Wall -O2 \
       -I../libs/libs-x86/include
LDFLAGS=-lupnp \
        -L ../libs/libs-x86/lib

Я думаю, что библиотеки, описанные в "/etc/ld.so.conf.d/", предназначены только для времени выполнения ... Надеюсь, это поможет!

1 голос
/ 09 марта 2011

GCC не указывает путь выполнения, чтобы динамический компоновщик мог находить динамические библиотеки во время выполнения ... Еще один вариант, работающий на нескольких платформах, заключается в том, чтобы жестко закодировать полный путь к библиотеке в ее soname. Это может быть достигнуто только путем изменения соответствующего файла .ml в libstdc ++ / config (а также libg ++ / config, если вы создаете libg ++), так что $ (libdir) / появляется непосредственно перед именем библиотеки в опциях -soname или -h .

http://gcc.gnu.org/faq.html#rpath

...