LD_LIBRARY_PATH不起作用

时间:2017-02-17 00:12:38

标签: c gcc linker zlib

我正在尝试编译一个使用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的使用中有-zld标记,但它可能会将-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已成功传递给链接器

2 个答案:

答案 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$