プログラムをコンパイルしようとしていますが、このエラーが返されます。
usr/bin/ld: cannot find -l<nameOfTheLibrary>
私のメークファイルで、私はコマンドg++
を使い、私のライブラリにリンクしています。
機能させるために追加するオプションはありますか?
ライブラリ名がlibxyz.so
で、パス上にある場合は、
/home/user/myDir
それからあなたのプログラムにそれをリンクするために:
g++ -L/home/user/myDir -lxyz myprog.cpp -o myprog
リンカが何を探しているのかを把握するには、冗長モードで実行します。
たとえば、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
ほら!
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
make
を介してg++
でコンパイルする際に、LIBRARY_PATH
オプションでMakefileを変更するのが適切でない場合は、-L
を定義してください。追加のライブラリを/opt/lib
に配置したので、次のようにしました。
$ export LIBRARY_PATH=/opt/lib/
そしてコンパイルとリンクを成功させるためにmake
を実行しました。
共有ライブラリを使用してプログラムを実行するには、次のように定義します。
$ export LD_LIBRARY_PATH=/opt/lib/
プログラムを実行する前に。
そもそも必要なライブラリをインストールできないという非常に一般的な初心者の問題に対処する答えはないようです。
Debianのプラットフォームでは、libfoo
が見つからない場合は、頻繁にインストールすることができます。
apt-get install libfoo-dev
-dev
バージョンのパッケージは開発作業に必要です。ライブラリにリンクするためのソースコードのコンパイルなどの些細な開発作業でさえも必要です。
パッケージ名は時々いくつかの装飾(lib
接頭辞なしのlibfoo0-dev
?foo-dev
など)を必要とするでしょう、あるいはあなたは単にあなたのディストリビューションの package search を使って特定のファイルを提供するパッケージを正確に見つけることができます。
(複数ある場合は、その違いを確認する必要があります。最もクールなものまたは最も人気のあるものを選ぶのが一般的な近道ですが、深刻な開発作業のための許容できる手順ではありません。)
他のアーキテクチャー(特にRPM)についても同様の手順が適用されますが、詳細は異なります。
まず、lxxx
name__の命名規則を知っておく必要があります。
/usr/bin/ld: cannot find -lc
/usr/bin/ld: cannot find -lltdl
/usr/bin/ld: cannot find -lXtst
lc
name__はlibc.so
を、lltdl
name__はlibltdl.so
を、lXtst
name__はlibXts.so
をそれぞれ意味します。
だから、それはlib
+ lib-name
+ .so
です。
名前がわかったら、locate
name__を使用してこの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
見つからない場合はyum
name__でインストールする必要があります(私は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
プログラムをコンパイルするときは、ライブラリへのパスを指定する必要があります。 g ++では、-Lオプションを使用します。
g++ myprogram.cc -o myprogram -lmylib -L/path/foo/bar
ライブラリの場所を確認します。例えば、lxxx.soです。
locate lxxx.so
/usr/lib
フォルダにない場合は、次のように入力します。
Sudo cp yourpath/lxxx.so /usr/lib
完了しました。
このエラーは、シンボリックリンクがダイナミックライブラリ(.so)への場合にも発生する可能性がありますが、従来の理由により、リンクフラグに-static
が表示されます。その場合は、削除してみてください。
すでに与えられた答えとは別に、*。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
私がリンクしようとしていたライブラリは、標準ではない名前を持つことが判明しました(つまり、 'lib'が前に付いていなかった)。
gcc test.c -Iinclude lib/cspice.a -lm
私の問題は、私が実行していたプログラムの親ディレクトリの名前を変更し(MVAPICHのmpicc
)、それがどういうわけかバイナリを台無しにしたことでした。 LD_LIBRARY_PATHを先頭に追加するだけでは十分ではなく、正しいパスに再コンパイルする必要がありました。
これが私のラップトップの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が正常にインストールされました!