【发布时间】:2014-05-24 07:22:11
【问题描述】:
我有一个构建,我希望链接并加载特定版本的库,并且系统上安装了同一库的不同版本。我正在使用 -L 选项来指向我希望链接的版本,但 gcc 似乎仍然选择已安装的版本。有没有办法强制 gcc 在搜索标准位置之前搜索使用 -L 选项指定的目录?
我正在运行带有 gcc 4.4.7 的 Centos 6.5。这是相关的库和目录 zlib-devel 没有安装
/lib64/libz.so.1.2.3
/lib64/libz.so.1 -> libz.so.1.2.3
/home/richj/product/zlib/lib/libz.so.1.2.8
/home/richj/product/zlib/lib/libz.so -> libz.so.1.2.8
/home/richj/product/zlib/lib/libz.so.1 -> libz.so.1.2.8
/home/richj/product/zlib/include/zlib.h
/home/richj/product/foo/libfoo.so
/home/richj/product/foo/foo.h
/home/richj/product/bar/bar.c
bar.c 中的 Main 调用 libfoo.so 中的 foo 并且 foo 调用 libz 中的 inflateInit 下面是 libfoo.so 和 bar 的编译命令。无论是图书馆还是 程序编译运行无错误。
/usr/bin/gcc -c -fPIC -Wall -g -I../zlib/include foo.c
/usr/bin/gcc -shared -o libfoo.so foo.o
/usr/bin/gcc -Wall -g -I../foo -L../foo -lfoo -L../zlib/lib -lz bar.c bar
$ldd bar
linux-vdso.so.1 => (0x00007fffd67ff000)
libfoo.so => ../foo/libfoo.so
libz.so.1 => /lib64/libz.so.1
libc.so.6 => /lib64/libc.so.6
/lib64/ld-linux-x86-64.so.2
所以问题是为什么它没有链接和加载我在编译命令中指向的 zlib 版本?
【问题讨论】:
-
编译失败还是运行时失败?仅仅因为 gcc 使用正确的库来链接并不能保证程序运行时使用正确的库。请提供有关您正在运行的操作系统和版本的详细信息。
-
编译链接针对
libz.so.1.2.8,但运行时加载程序没有被告知要查看那里,因此它找到了标准库。要么设置 LD_LIBRARY_PATH,要么(如果你不介意搞砸所有人)修改/etc/ld.so.conf,或者使用传递选项(可能是-Wl,rpath=$HOME/product/zlib/lib)使可执行文件首先出现在正确的位置。
标签: gcc