ライブラリがパスにあるかどうかを確認する


13

ライブラリがインストールされていて、プログラムで使用できるかどうかをテストしたいとします。それがldconfig -p | grep mylibシステムにインストールされているかどうかを確認するために使用できます。しかし、ライブラリが設定によってのみ知られている場合はどうなりますLD_LIBRARY_PATHか?

その場合、プログラムはライブラリを見つけることができるかもしれませんが、できldconfigません。ライブラリが結合されたリンカーパスにあるかどうかを確認するにはどうすればよいですか?

実際にプログラムが手元にない場合でも機能する解決策を探していることを追加します(たとえば、プログラムはまだコンパイルされていません)。特定のライブラリがld'に存在することを知りたいだけです。sパス。


2
を使用ldd <binary>して、リンクされているすべてのライブラリがパスに含まれているかどうかを確認できます。よりエレガントな方法があるかもしれません。
トーマス

@トーマスコメントの答えを出すべきだと思います。lddまさにこの目的を果たします。
lgeorget

1
@トーマス-しかし、プログラムがまだコンパイルされておらず、そのライブラリがコンパイルに必要な場合はどうなりますか?
nbubis 2016年

@Igeorget-私の編集/コメントを参照してください
nbubis

@nbubis:コンパイル用のライブラリが必要な場合、通常はコンパイラLIBRARY_PATHなどによって検索される環境変数を使用する必要がありますgccLIBRARY_PATH環境変数は、ディレクトリをコロンで区切ったリストを持っています。
トーマス

回答:


14

ldconfig アクセスできるすべてのライブラリをリストできます。これらのライブラリもキャッシュに保存されます。

/sbin/ldconfig -v -Nキャッシュを再構築せずに、通常のすべてのライブラリパスをクロールし、使用可能なすべてのライブラリをリストします(非rootユーザーの場合は不可能です)。LD_LIBRARY_PATHのライブラリは考慮されません(この投稿が編集前に言ったこととは逆に)が、次の行を使用してコマンドラインに追加のライブラリを渡すことができます。

/sbin/ldconfig -N -v $(sed 's/:/ /g' <<< $LD_LIBRARY_PATH)

ldconfigは、1990年代に放棄された1980年代のツールです。このような理由から、ldconfigそれだけのSunOS-4.0に基づいているの実装に適用されるようなポータブルではありませんa.out1987年からベースのダイナミックリンカ
シリー

これは、LD_LIBRARY_PATHにのみ存在するライブラリの一覧表示にどのように役立ちますか?スクリプトを記述して解析し、ldconfigを介して読み取ることができると思いますが、少しやりすぎのようです。
nbubis 2016年

1
@nbubisを使用すると、LD_LIBRARY_PATHのライブラリを常にldconfigに渡すことができます。/sbin/ldconfig -N -v $(sed 's/:/ /' <<< $LD_LIBRARY_PATH)私の好みに過剰過ぎないように。
lgeorget 2016年

@schilyほんと?私の知る限り、これはELFライブラリでかなりうまく動作します。そして、それはまだ使用されており、ld.soはldconfigによって構築されたキャッシュに依存しています。
lgeorget 2016年

Linuxの人々は、ELFをサポートするために古いSunリンカーのソースコードをハッキングしました。ldconfigリンカーキャッシングはエラーに敏感すぎるため、Sunの新しいELF実装はAT&Tとの合意により削除されました。Sunは後で追加the tree stoogesmoelariおよびcrleELF管理のためのヘルパープログラムとして。
2016年

2

:LD_LIBRARY_PATHでグローバルに(スペース)を置換

/sbin/ldconfig -N -v $(sed 's/:/ /g' <<< $LD_LIBRARY_PATH)

2

gccを使用して簡単なテストプログラムをコンパイルし、ライブラリをリンクできます。次に、使用したライブラリをlddで確認できます。私はこのようなものを使用します:

echo "int main(){}" | gcc -x c++ -Wl,--no-as-needed -lmylib - && ldd a.out | grep mylib

-Wl,--no-as-needed ライブラリのシンボルが使用されないため、リンカーがライブラリを破棄しないようにします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.