gpt4 book ai didi

c - LD_LIBRARY_PATH 不起作用

转载 作者:太空宇宙 更新时间:2023-11-04 01:21:07 41 4
gpt4 key购买 nike

我正在尝试编译一个使用 zlib 的演示,我想我已经为 LD_LIBRARY_PATH 做了正确的设置,但它不适用于 -lz 标志,你能帮我找出问题所在吗?

lisanhu@lisanhu-XPS-15-9550:kseq$ echo $LD_LIBRARY_PATH 
/home/lisanhu/mine/repos/zlib/output/lib
lisanhu@lisanhu-XPS-15-9550:kseq$ make
gcc -g -O2 kseq_test.c -o kseq_test -lz
/usr/bin/ld: cannot find -lz
collect2: error: ld returned 1 exit status
Makefile:3: recipe for target 'all' failed
make: *** [all] Error 1
lisanhu@lisanhu-XPS-15-9550:kseq$ gcc -static -o kseq_test kseq_test.o -lz -L/home/lisanhu/mine/repos/zlib/output/lib
lisanhu@lisanhu-XPS-15-9550:kseq$

问题是,如果我使用 -L 强制搜索文件夹,它会起作用,如果我将该文件夹放在 LD_LIBRARY_PATH 中,它就不起作用。我很确定我已经使用了 export LD_LIBRARY_PATH 但它仍然不起作用。

这很烦人,因为如果我需要编译需要它的其他人的代码,设置环境变量来搜索库会更容易。

------------更新------------

我在另一台服务器上试过了,它运行得很顺利

[lisanhu@farber tmp]$ export LD_LIBRARY_PATH=/home/1677/mine/repos/zlib/zlib-1.2.8
[lisanhu@farber tmp]$ ls
gmon.out kseq.h kseq.tar kseq_test kseq_test.c Makefile
[lisanhu@farber tmp]$ make
cc -g -O2 kseq_test.c -o kseq_test -lz
[lisanhu@farber tmp]$ ldd kseq_test
linux-vdso.so.1 => (0x00007fffb01a6000)
libz.so.1 => /home/1677/mine/repos/zlib/zlib-1.2.8/libz.so.1 (0x00007f9556c83000)
libc.so.6 => /lib64/libc.so.6 (0x00000031fa400000)
/lib64/ld-linux-x86-64.so.2 (0x00000031fa000000)
[lisanhu@farber tmp]$

所以我的配置可能是正确的?有任何想法吗?我已经在装有 Ubuntu 16.04 和 Fedora 25 的笔记本电脑上试用过,已于 2017 年 2 月 16 日更新至稳定版。服务器我只能说它不是最新更新的。请问是不是最新的gcc有问题?

------------更新------------

我可能知道导致问题的原因。错误消息是 cannot find -lz。它似乎将 -lz 视为单个文件。我发现在 ld 的用法中同时存在 -l-z 标志,而它可能会将 -lz 转换为类似的东西,发现我们没有两个标志的参数,然后将它们组合在一起作为一个文件参数?不完全确定我的推论,但有人知道如何处理这种情况吗?

------------更新------------

完整的生成文件

all:kseq.h kseq_test.c
$(CC) -g -O2 kseq_test.c -o kseq_test -lz

clean:
rm -f *.o

------------更新------------

第三部分可能不是一个有效的解释,因为在将 -v 附加到 cc 之后,我发现 -lz 已成功传递给链接器

最佳答案

2020 年 9 月 5 日更新

终于弄清楚了问题,因此为所有关心的人更新了这个答案。

当您编译代码时,您告诉它使用 -lfoo 等标志搜索共享库,编译器将为每个出现的文件夹添加 -L 标志在 LIBRARY_PATH 中,链接器 ld 将搜索除默认位置之外的每个 -L 文件夹。如果链接器找不到文件 libfoo.solibfoo.a,它将失败。

解决此问题的方法是将-L 添加到带有您的库文件夹的编译行,但这通常意味着您需要更改您的Makefile,这不是我的最佳实践想想。

另一种方法是将您的库文件夹放入 LIBRARY_PATH,因为 gcc 和大多数编译器会自动将 -L 标志添加到这些文件夹在传递给链接器之前,无论您是使用静态库还是动态库进行编译,编译器都只会检查 LIBRARY_PATH。所以 LD_LIBRARY_PATH 在编译过程中是无用的。

LD_LIBRARY_PATH 将在您实际运行程序时由系统检查。这是允许系统上存在同一库的多个版本的好方法。例如,一些旧代码可能需要 CUDA 9,一些新代码可能需要 CUDA 11,LD_LIBRARY_PATH 在这种情况下很有用。

===

终于找到解决办法了。只是不要使用 LD_LIBRARY_PATH 而是使用 LIBRARY_PATH。它工作正常且顺利。从 GNU ld cannot find library which is there 获得灵感仍然不清楚是什么原因,但至少它现在工作正常。

lisanhu@lisanhu-XPS-15-9550:kseq$ export LD_LIBRARY_PATH=~/mine/repos/zlib/output/lib;
lisanhu@lisanhu-XPS-15-9550:kseq$ make
cc -g -O2 kseq_test.c -o kseq_test -lz
/usr/bin/ld: cannot find -lz
clang-3.9: error: linker command failed with exit code 1 (use -v to see invocation)
Makefile:2: recipe for target 'all' failed
make: *** [all] Error 1
lisanhu@lisanhu-XPS-15-9550:kseq$ ls
kseq.h kseq_test.c kseq_test.o Makefile test.seq
lisanhu@lisanhu-XPS-15-9550:kseq$ export LIBRARY_PATH=~/mine/repos/zlib/output/lib;
lisanhu@lisanhu-XPS-15-9550:kseq$ make
cc -g -O2 kseq_test.c -o kseq_test -lz
lisanhu@lisanhu-XPS-15-9550:kseq$ ls
kseq.h kseq_test kseq_test.c kseq_test.o Makefile test.seq
lisanhu@lisanhu-XPS-15-9550:kseq$ ldd kseq_test
linux-vdso.so.1 => (0x00007fffcd135000)
/lib/$LIB/liblsp.so => /lib/lib/x86_64-linux-gnu/liblsp.so (0x00007f5fe93cb000)
libz.so.1 => /home/lisanhu/mine/repos/zlib/output/lib/libz.so.1 (0x00007f5fe91b1000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5fe8dca000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f5fe8bc6000)
/lib64/ld-linux-x86-64.so.2 (0x000056051fc0c000)
lisanhu@lisanhu-XPS-15-9550:kseq$

关于c - LD_LIBRARY_PATH 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42287141/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com