我正在尝试编译一个使用zlib的demo,我想我已经为LD_LIBRARY_PATH做了正确的设置,但是它不能用-lz标志,请你帮我找一下&#39问题是什么?
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
视为单个文件。我发现在-l
的使用中有-z
和ld
标记,但它可能会将-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已成功传递给链接器
答案 0 :(得分:3)
LD_LIBRARY_PATH用于在运行时查找共享库。在您的情况下,您希望在编译时提供路径...默认情况下,这不是环境变量(除非您的makefile明确地查看您的环境)。您需要在命令行上将它传递给编译器,例如:
gcc -g -O2 kseq_test.c -o kseq_test -L /home/lisanhu/mine/repos/zlib/output/lib -lz
答案 1 :(得分:1)
最后找到解决方案。只是不要使用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$