我不明白。我通常将第三方软件安装到 /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),它在 /etc/ld.so.conf.d/libc 中有一个用于 /usr/local/lib 的条目。 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 搜索哪些库路径?也许那里出了点问题。
最佳答案
gcc -print-search-dirs 会告诉您编译器检查的路径。/usr/local/lib 根本不在其中,因此您的编译时链接器(在本例中是来自 binutils 的新黄金 ld)找不到库,而动态链接器(ld-linux.so 读取由ldconfig) 会。据推测,您之前完成的构建可能在其 makefile 中根据需要添加了 -L/usr/local/lib(通常由 ./configure 脚本完成),或者您安装了二进制文件。
关于c -/usr/local/lib 中的共享库未找到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5873516/