【发布时间】:2012-07-08 17:54:42
【问题描述】:
我正在阅读 GCC 简介,它说一个包是否同时具有 .a 和 .so。 gcc 更喜欢共享库。默认情况下,加载程序仅在一组预定义的系统目录中搜索共享库,例如/usr/local/lib 和/usr/lib。如果库不在这些目录之一中,则必须将其添加到加载路径,或者您需要使用-static 选项强制它使用 .a 库。但是,我尝试了以下方法:
vim hello.c:
#include <gmp.h>
#include <stdio.h>
int main() {
mpz_t x;
mpz_init(x);
return 0;
}
gcc hello.c -I/opt/include -L/opt/lib -lgmp (my gmp library is in opt)
./a.out
它运行。书上说应该有以下错误:
./a.out: error while loading shared libraries:
libgdbm.so.3: cannot open shared object file:
No such file or directory
(嗯,这本书以 GDBM 为例,但我使用了 GMP,但这无所谓吧?)
但是,我没有设置LD_LIBRARY_PATH=/opt/lib,正如你所见,我也没有使用-static 选项,但a.out 仍然运行。
你们能告诉我为什么并告诉我如何得到书中描述的错误吗?是的,我想要这个错误,所以我会理解我误解了什么。
【问题讨论】:
-
您是否 100% 确定
/usr/lib中没有libgmp?另外,请确保/etc/ld.so.conf中没有/opt/lib的条目。 -
另外,请确保您的
LD_LIBRARY_PATH没有为您设置。使用LD_LIBRARY_PATH=取消设置(=之后没有任何内容)。 -
我使用 echo LD_LIBRARY_PATH 来验证它已经是空的。谢谢!此外,我之前确实将库安装在 /usr/local 下(作为学习的一种方式),但我已经将它们全部删除并再次安装到 /opt/。感谢大家的热心帮助
-
ldd在您的a.out上的输出是什么样的? -
linux-gate.so.1 => (0xb7746000) libgmp.so.10 => /usr/lib/i386-linux-gnu/libgmp.so.10 (0xb76c5000) libc.so. 6 => /lib/i386-linux-gnu/libc.so.6 (0xb7520000) /lib/ld-linux.so.2 (0xb7747000) 谢谢
标签: c gcc compiler-construction