gcc更改库的搜索顺序

时间:2014-05-22 22:25:26

标签: gcc

我有一个构建,我希望链接并加载特定版本的库,并在系统上安装相同库的不同版本。我使用-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中调用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版本?

1 个答案:

答案 0 :(得分:2)

-L/path/to/libs传递给gcc有助于编译器知道在哪里查找。除非您要求,否则此信息不会被编译到已编译的输出中。否则,二进制文件可能只适用于编译它的系统。

您需要做的就是将-Wl,rpath,/path/to/library添加到链接命令中。这将在程序中设置rpath,以便当共享库加载器开始查找所需的库时,它将知道有一个额外的位置可供查找。

顺便说一句,如果这个位置是您安装库并期望使用许多程序的地方,您还可以在/etc/ld.so.conf.d中添加一个文件,其中只包含包含库的目录的完整路径。这将允许使用共享库加载器的所有程序无需在每个程序中嵌入rpath即可工作。