【问题标题】:gcc change the search order for librariesgcc 更改库的搜索顺序
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    • 2014-12-27
    • 1970-01-01
    相关资源
    最近更新 更多