【发布时间】:2017-02-17 00:12:38
【问题描述】:
我正在尝试编译一个使用 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 转换为类似的东西,发现我们没有两个标志的参数,然后将它们组合在一起单个文件参数?
不完全确定我的推论,但有人知道如何处理这种情况吗?
-------------更新------------
完整的 Makefile
all:kseq.h kseq_test.c
$(CC) -g -O2 kseq_test.c -o kseq_test -lz
clean:
rm -f *.o
-------------更新------------
第 3 部分可能不是一个有效的解释,因为在将 -v 附加到 cc 之后,我发现 -lz 已成功传递给链接器
【问题讨论】:
-
请向我们展示 Makefile 的相关部分,典型的是调用链接器的那些行。