2017-02-17 2 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を1つのファイルとして扱っているようです。私はと-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

典型的な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の両方があります。共有ライブラリや静的ライブラリを探していても、それを見つけるはずです。また、ライブラリをロードする前にパスをロードする必要があるため、-lzを-Lの前に置く必要があります。 これは私のMakefileではなく、図書館の作者のウェブサイトから来たものです。そのため、Makefileを変更したくないので、 '-L'を使う代わりに環境変数解決をしたいのです。それ以上のアイデアは? –

+1

@SanhuLi:リンカーを呼び出すときに 'LDFLAGS'を使用するかどうかをMakefileでチェックします。このenv/var /を 'make'を実行する前に設定することができます。そしてBTW、* kcraigie *は完全に正しいです。 'LD_LIBRARY_PATH'はリンカーがライブラリを検索するために使用していません。 – alk

+0

@alkあなたの助けをありがとう、私はあなたの考えに同意しない。最初のセクションは、makeを呼び出す前にLD_LIBRARY_PATHの値を表示しています。 LD_LIBRARY_PATHの値はすでに設定されています。そして、MakefileがLDFLAGSを使用していないのは残念です。 2番目のセクションは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$ 
関連する問題