Общая библиотека в / usr / local / lib не найдена - PullRequest
6 голосов
/ 03 мая 2011

Я не понимаю. Обычно я устанавливаю стороннее программное обеспечение в / usr / local , поэтому библиотеки устанавливаются в / usr / local / lib и никогда не возникало проблем с подключением к этим библиотекам. Но теперь это внезапно перестало работать:

$ gcc -lkaytils -o test test.c
/usr/bin/ld.gold.real: error: cannot find -lkaytils
/usr/bin/ld.gold.real: /tmp/ccXwCkYk.o: in function main:test.c(.text+0x15):
error: undefined reference to 'strCreate'
collect2: ld returned 1 exit status

Когда я добавляю параметр -L/usr/local/lib, он работает, но мне никогда не приходилось использовать это раньше. Заголовочные файлы в / usr / local / include находятся без добавления -I/usr/local/include.

Я использую Debian GNU / Linux 6 (Squeeze), в котором есть запись для / usr / local / lib в / etc / ld.so.conf.d / libc.conf по умолчанию, и кеш ldconfig знает библиотеку, которую я пытаюсь использовать:

k@vincent:~$ ldconfig -p | grep kaytils
        libkaytils.so.0 (libc6,x86-64) => /usr/local/lib/libkaytils.so.0
        libkaytils.so (libc6,x86-64) => /usr/local/lib/libkaytils.so

Так какого чёрта здесь происходит? Где я могу проверить, какие пути к библиотекам ищет gcc по умолчанию? Может быть, там что-то не так.

Ответы [ 2 ]

7 голосов
/ 03 мая 2011

gcc -print-search-dirs скажет вам, какой путь проверяет компилятор./ usr / local / lib просто не входит в их число, поэтому ваш компоновщик времени компиляции (в данном случае новый gold ld из binutils) не находит библиотеку, а динамическую (ld-linux.so, которая читает кэш, написанныйldconfig) делает.Предположительно, сборки, которые вы сделали ранее, добавляли -L / usr / local / lib по мере необходимости в свои make-файлы (обычно выполняемые сценарием ./configure), или вы установили двоичные файлы.

2 голосов
/ 03 мая 2011

Вероятно, это проблема переменных среды - у вас есть что-то, включающее / usr / local / include, но не / usr / local / lib

Из карты GCC по переменным среды

       CPATH specifies a list of directories to be searched as if speci‐
       fied with -I, but after any paths given with -I options on the com‐
       mand line.  This environment variable is used regardless of which
       language is being preprocessed.

и

       The value of LIBRARY_PATH is a colon-separated list of directories,
       much like PATH.  When configured as a native compiler, GCC tries
       the directories thus specified when searching for special linker
       files, if it can’t find them using GCC_EXEC_PREFIX.  Linking using
       GCC also uses these directories when searching for ordinary
       libraries for the -l option (but directories specified with -L come
       first).

попробуйте "printenv", чтобы увидеть, что вы установили

...