web-dev-qa-db-ja.com

usr/bin/ld:-l <nameOfTheLibrary>が見つかりません

プログラムをコンパイルしようとしていますが、このエラーが返されます。

usr/bin/ld: cannot find -l<nameOfTheLibrary>

私のメークファイルで、私はコマンドg++を使い、私のライブラリにリンクしています。

機能させるために追加するオプションはありますか?

327
ZoOo

ライブラリ名がlibxyz.soで、パス上にある場合は、

/home/user/myDir

それからあなたのプログラムにそれをリンクするために:

g++ -L/home/user/myDir -lxyz myprog.cpp -o myprog
148
Saurabh Bhola

リンカが何を探しているのかを把握するには、冗長モードで実行します。 

たとえば、ZLIBサポートを使用してMySQLをコンパイルしようとしたときにこの問題が発生しました。コンパイル中に次のようなエラーが表示されました。

/usr/bin/ld: cannot find -lzlib

私はいくつかのGoogl'ingをして、人々が.soファイルが実際に存在することを確かめるために言うであろう同じ種類の異なる問題に出くわし続け、それからバージョン管理されたファイルへのシンボリックリンクを作成します。そう1.2.8。しかし、私がチェックしたとき、zlib.so DIDは存在しています。それで、私は、確かにそれは問題になることができないと思いました。 

私はインターネット上でLD_DEBUG = allを指定してmakeを実行することを提案する別の投稿に出会いました。

LD_DEBUG=all make

私は大量のデバッグ出力を得ましたが、実際には役に立ちませんでした。それは何よりも混乱を引き起こしました。それで、私はあきらめようとしていました。

その後、私はエピファニーを起こしました。 ldコマンドのヘルプテキストを実際にチェックすることを考えました。

ld --help

これから、冗長モードでldを実行する方法を考え出しました(想像してみてください)。

ld -lzlib --verbose

これは私が得た出力です:

==================================================
attempt to open /usr/x86_64-linux-gnu/lib64/libzlib.so failed
attempt to open /usr/x86_64-linux-gnu/lib64/libzlib.a failed
attempt to open /usr/local/lib64/libzlib.so failed
attempt to open /usr/local/lib64/libzlib.a failed
attempt to open /lib64/libzlib.so failed
attempt to open /lib64/libzlib.a failed
attempt to open /usr/lib64/libzlib.so failed
attempt to open /usr/lib64/libzlib.a failed
attempt to open /usr/x86_64-linux-gnu/lib/libzlib.so failed
attempt to open /usr/x86_64-linux-gnu/lib/libzlib.a failed
attempt to open /usr/local/lib/libzlib.so failed
attempt to open /usr/local/lib/libzlib.a failed
attempt to open /lib/libzlib.so failed
attempt to open /lib/libzlib.a failed
attempt to open /usr/lib/libzlib.so failed
attempt to open /usr/lib/libzlib.a failed
/usr/bin/ld.bfd.real: cannot find -lzlib

丁、丁、丁...

それで、最終的にそれを修正するために、(バンドルされているバージョンではなく)私自身のバージョンのZLIBでMySQLをコンパイルできるようにします。

Sudo ln -s /usr/lib/libz.so.1.2.8 /usr/lib/libzlib.so

ほら!

363
dcarrith

コンパイル時間

G ++がcannot find -l<nameOfTheLibrary>と言っている場合、g ++はファイルlib{nameOfTheLibrary}.soを探していましたが、デフォルトでは/usr/lib/usr/local/libを指している共有ライブラリ検索パスでそれを見つけることができませんでした。

この問題を解決するには、それらの検索パスでライブラリファイル(lib{nameOfTheLibrary}.so)を提供するか、-Lコマンドオプションを使用する必要があります。 -L{path}は、デフォルトパスに加えて、パス{path}でライブラリファイルを見つけるようにg ++(実際にはld)に指示します。

例:/home/taylor/libswift.soにライブラリがあり、アプリをこのライブラリにリンクするとします。この場合、g ++に次のオプションを指定する必要があります。

g++ main.cpp -o main -L/home/taylor -lswift
  • 注1-lオプションは、ライブラリ名withoutlibおよび.soの最初と最後を取得します。

  • 注2:場合によっては、ライブラリファイル名の後にバージョンが続きます(例:libswift.so.1.2)。これらの場合、g ++もライブラリファイルを見つけることができません。これを修正する簡単な回避策は、libswift.so.1.2というlibswift.soへのシンボリックリンクを作成することです。


ランタイム

アプリを共有ライブラリにリンクする場合、アプリを実行するときは常にライブラリが利用可能である必要があります。ランタイムでは、アプリ(実際には動的リンカー)はLD_LIBRARY_PATHでライブラリを探します。パスのリストを保存する環境変数です。

例:libswift.soの例の場合、動的リンカーはlibswift.so(デフォルトの検索パスを指す)でLD_LIBRARY_PATHを見つけることができません。問題を解決するには、libswift.soが含まれているパスにその変数を追加する必要があります。

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/taylor
30
Hi I'm Frogatto

makeを介してg++でコンパイルする際に、LIBRARY_PATHオプションでMakefileを変更するのが適切でない場合は、-Lを定義してください。追加のライブラリを/opt/libに配置したので、次のようにしました。 

$ export LIBRARY_PATH=/opt/lib/

そしてコンパイルとリンクを成功させるためにmakeを実行しました。

共有ライブラリを使用してプログラムを実行するには、次のように定義します。

$ export LD_LIBRARY_PATH=/opt/lib/

プログラムを実行する前に。

28

そもそも必要なライブラリをインストールできないという非常に一般的な初心者の問題に対処する答えはないようです。

Debianのプラットフォームでは、libfooが見つからない場合は、頻繁にインストールすることができます。

apt-get install libfoo-dev

-devバージョンのパッケージは開発作業に必要です。ライブラリにリンクするためのソースコードのコンパイルなどの些細な開発作業でさえも必要です。

パッケージ名は時々いくつかの装飾(lib接頭辞なしのlibfoo0-devfoo-devなど)を必要とするでしょう、あるいはあなたは単にあなたのディストリビューションの package search を使って特定のファイルを提供するパッケージを正確に見つけることができます。

(複数ある場合は、その違いを確認する必要があります。最もクールなものまたは最も人気のあるものを選ぶのが一般的な近道ですが、深刻な開発作業のための許容できる手順ではありません。)

他のアーキテクチャー(特にRPM)についても同様の手順が適用されますが、詳細は異なります。

25
tripleee

まず、lxxxname__の命名規則を知っておく必要があります。

/usr/bin/ld: cannot find -lc
/usr/bin/ld: cannot find -lltdl
/usr/bin/ld: cannot find -lXtst

lcname__はlibc.soを、lltdlname__はlibltdl.soを、lXtstname__はlibXts.soをそれぞれ意味します。

だから、それはlib+ lib-name + .soです。


名前がわかったら、locatename__を使用してこのlxxx.soファイルのパスを見つけることができます。

$ locate libiconv.so
/home/user/anaconda3/lib/libiconv.so   # <-- right here
/home/user/anaconda3/lib/libiconv.so.2
/home/user/anaconda3/lib/libiconv.so.2.5.1
/home/user/anaconda3/lib/preloadable_libiconv.so
/home/user/anaconda3/pkgs/libiconv-1.14-0/lib/libiconv.so
/home/user/anaconda3/pkgs/libiconv-1.14-0/lib/libiconv.so.2
/home/user/anaconda3/pkgs/libiconv-1.14-0/lib/libiconv.so.2.5.1
/home/user/anaconda3/pkgs/libiconv-1.14-0/lib/preloadable_libiconv.so

見つからない場合はyumname__でインストールする必要があります(私はCentOSを使います)。通常、あなたはこのファイルを持っています、しかしそれは正しい場所にリンクしません。


正しい場所にリンクしてください。通常は/lib64または/usr/lib64です。

$ Sudo ln -s /home/user/anaconda3/lib/libiconv.so /usr/lib64/

完了しました。

ref: https://i-pogo.blogspot.jp/2010/01/usrbinld-cannot-find-lxxx.html

5
Belter

プログラムをコンパイルするときは、ライブラリへのパスを指定する必要があります。 g ++では、-Lオプションを使用します。

g++ myprogram.cc -o myprogram -lmylib -L/path/foo/bar
4
koan

ライブラリの場所を確認します。例えば、lxxx.soです。 

locate lxxx.so

/usr/libフォルダにない場合は、次のように入力します。

Sudo cp yourpath/lxxx.so /usr/lib

完了しました。

2
hua

このエラーは、シンボリックリンクがダイナミックライブラリ(.so)への場合にも発生する可能性がありますが、従来の理由により、リンクフラグに-staticが表示されます。その場合は、削除してみてください。

2
Vzbux

すでに与えられた答えとは別に、*。soファイルは存在するが、適切な名前が付けられていない場合もあります。または* .soファイルが存在していても、別のユーザー/ rootが所有している可能性があります。

問題1: /不適切な名前 

ファイルを-l<nameOfLibrary> としてリンクしている場合は、ライブラリファイル名はlib<nameOfLibrary> の形式でなければなりません。<nameOfLibrary>.soファイルしかない場合は、名前を変更してください。

問題2: 間違った所有者

これが問題ではないことを確認するには

ls -l /path/to/.so/file

ファイルがrootまたは他のユーザーによって所有されている場合は、次の操作を実行する必要があります。

Sudo chown yourUserName:yourUserName /path/to/.so/file
1
user13107

私がリンクしようとしていたライブラリは、標準ではない名前を持つことが判明しました(つまり、 'lib'が前に付いていなかった)。 

gcc test.c -Iinclude lib/cspice.a -lm

1
Brian Burns

私の問題は、私が実行していたプログラムの親ディレクトリの名前を変更し(MVAPICHのmpicc)、それがどういうわけかバイナリを台無しにしたことでした。 LD_LIBRARY_PATHを先頭に追加するだけでは十分ではなく、正しいパスに再コンパイルする必要がありました。

0

これが私のラップトップのUbuntu情報です。

lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.2 LTS
Release:    18.04
Codename:   bionic

Boost_filesystemとboost_systemの.soファイルを見つけるために、locateを使用します

locate libboost_filesystem
locate libboost_system

次に、.soファイルを/ usr/libにリンクし、.soに名前を変更します

Sudo ln -s /usr/lib/x86_64-linux-gnu/libboost_filesystem.so.1.65.1 /usr/lib/libboost_filesystem.so
Sudo ln -s /usr/lib/x86_64-linux-gnu/libboost_system.so.1.65.1 /usr/lib/libboost_system.so

できた! Rパッケージvelocyto.Rが正常にインストールされました!

0
Shicheng Guo