我有一个构建,我希望链接并加载特定版本的库,并在系统上安装相同库的不同版本。我使用-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版本?
答案 0 :(得分:2)
将-L/path/to/libs
传递给gcc有助于编译器知道在哪里查找。除非您要求,否则此信息不会被编译到已编译的输出中。否则,二进制文件可能只适用于编译它的系统。
您需要做的就是将-Wl,rpath,/path/to/library
添加到链接命令中。这将在程序中设置rpath
,以便当共享库加载器开始查找所需的库时,它将知道有一个额外的位置可供查找。
顺便说一句,如果这个位置是您安装库并期望使用许多程序的地方,您还可以在/etc/ld.so.conf.d
中添加一个文件,其中只包含包含库的目录的完整路径。这将允许使用共享库加载器的所有程序无需在每个程序中嵌入rpath即可工作。