2017-02-17 324 views
0

我想编译一个使用zlib的演示,我想我已经为LD_LIBRARY_PATH设置了正确的设置,但是它不能和-lz标志一起使用,请问我能找到什么问题?LD_LIBRARY_PATH不起作用

[email protected]:kseq$ echo $LD_LIBRARY_PATH 
/home/lisanhu/mine/repos/zlib/output/lib 
[email protected]: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 
[email protected]:kseq$ gcc -static -o kseq_test kseq_test.o -lz -L/home/lisanhu/mine/repos/zlib/output/lib 
[email protected]:kseq$ 

的问题是,如果我使用-L强制搜索的文件夹,它的工作原理,如果我把LD_LIBRARY_PATH该文件夹,这是行不通的。我很确定我已经使用export LD_LIBRARY_PATH,但它仍然不起作用。

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

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

在我尝试这样做另一台服务器,它工作顺利

[[email protected] tmp]$ export LD_LIBRARY_PATH=/home/1677/mine/repos/zlib/zlib-1.2.8 
[[email protected] tmp]$ ls 
gmon.out kseq.h kseq.tar kseq_test kseq_test.c Makefile 
[[email protected] tmp]$ make 
cc -g -O2 kseq_test.c -o kseq_test -lz 
[[email protected] 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) 
[[email protected] tmp]$ 

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

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

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

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

完整的Makefile

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

clean: 
     rm -f *.o 

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

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

+0

请向我们展示Makefile的相关部分,这些部分通常是调用链接器的那些行。 – alk

回答

3

LD_LIBRARY_PATH用于在运行时查找共享库。在你的情况下,你想在编译时提供一个路径...这不是默认的环境变量(除非你的makefile显式地查看你的环境)。您需要将它通过命令行传递给编译器,例如:

gcc -g -O2 kseq_test.c -o kseq_test -L /home/lisanhu/mine/repos/zlib/output/lib -lz 
+0

谢谢你的回答,而实际上在那个文件夹中同时存在libz.so和libz.a。我相信无论它在寻找共享库还是静态库,它都应该找到它。还需要在-L之前放置-lz,因为它需要在加载库之前加载路径。 这不是我的Makefile,它来自库作者的网站,这就是为什么我希望有一个环境变量解决方案,而不是使用'-L',因为我不想更改Makefile。有关于它的更多想法? –

+1

@SanhuLi:在调用链接器时检查Makefile是否使用'LDFLAGS'或类似。然后你可以在运行'make'之前设置这个env/var /。顺便说一下,* kcraigie *完全正确,LD_LIBRARY_PATH不被链接器用于搜索库。 – alk

+0

@alk谢谢你的帮助,而我不同意你的想法。第一部分在调用make之前显示LD_LIBRARY_PATH的值。 LD_LIBRARY_PATH的值已经设置。而且很遗憾Makefile没有使用LDFLAGS。第二部分在运行gcc4.9的服务器上运行,至少它搜索LD_LIBRARY_PATH并找到该库。请不要在Makefile中没有使用-static标志,并且在进行链接时,我相信它会首先搜索动态链接文件,这由ldd结果显示,它使用LD_LIBRARY_PATH中的.so文件。 –

0

最后找到解决方案。只是不要使用LD_LIBRARY_PATH并改用LIBRARY_PATH。它工作正常,顺利。从GNU ld cannot find library which is there得到想法 仍然不清楚是什么原因,但至少现在工作正常。

[email protected]:kseq$ export LD_LIBRARY_PATH=~/mine/repos/zlib/output/lib; 
[email protected]: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 
[email protected]:kseq$ ls 
kseq.h kseq_test.c kseq_test.o Makefile test.seq 
[email protected]:kseq$ export LIBRARY_PATH=~/mine/repos/zlib/output/lib; 
[email protected]:kseq$ make 
cc -g -O2 kseq_test.c -o kseq_test -lz 
[email protected]:kseq$ ls 
kseq.h kseq_test kseq_test.c kseq_test.o Makefile test.seq 
[email protected]: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) 
[email protected]:kseq$