web-dev-qa-db-ja.com

Linuxマシンにインストールされているlibstdc ++ライブラリのバージョンをどのように見つけますか?

次のコマンドを見つけました:strings /usr/lib/libstdc++.so.6 | grep GLIBC from here 。うまくいくようですが、これはアドホック/ヒューリスティックな方法です。

ライブラリバージョンのC++を照会するために使用できる特定のコマンドはありますか?または、私が受け入れた方法を見つけた方法ですか?

62

使用されているライブラリを見つけるには、実行することができます

 $ /sbin/ldconfig -p | grep stdc++
    libstdc++.so.6 (libc6) => /usr/lib/libstdc++.so.6

Libstdc ++バージョン3.4.0以上の互換バージョンのリストは、

 $ strings /usr/lib/libstdc++.so.6 | grep LIBCXX
 GLIBCXX_3.4
 GLIBCXX_3.4.1
 GLIBCXX_3.4.2
 ...

以前のバージョンでは、シンボルGLIBCPPが定義されています。

ライブラリの日付スタンプは、バージョンに応じてマクロ__GLIBCXX__または__GLIBCPP__で定義されます。

// libdatestamp.cxx
#include <cstdio>

int main(int argc, char* argv[]){
#ifdef __GLIBCPP__
    std::printf("GLIBCPP: %d\n",__GLIBCPP__);
#endif
#ifdef __GLIBCXX__
    std::printf("GLIBCXX: %d\n",__GLIBCXX__);
#endif
   return 0;
}

$ g++ libdatestamp.cxx -o libdatestamp
$ ./libdatestamp
GLIBCXX: 20101208

Libstdc ++バージョンの日付スタンプの表は、 documentation にリストされています。

72
Dmitri Chubarov

私が使用する傾向があるメカニズムは、readelf -Vを組み合わせてlibstdc ++から.gnu.version情報をダンプし、次に抽出された最大のGLIBCXX_値に一致するルックアップテーブルです。

readelf -sV /usr/lib/libstdc++.so.6 | sed -n 's/.*@@GLIBCXX_//p' | sort -u -V | tail -1

sortのバージョンが古すぎて-Vオプション(バージョン番号で並べ替える)がない場合は、次を使用できます。

tr '.' ' ' | sort -nu -t ' ' -k 1 -k 2 -k 3 -k 4 | tr ' ' '.'

sort -u -Vの代わりに、最大4つのバージョンの数字でソートします。

一般に、ABIバージョンを一致させることで十分なはずです。

ただし、libstdc++.so.<VERSION>を追跡する場合は、次のような小さなbashを使用できます。

file=/usr/lib/libstdc++.so.6
while [ -h $file ]; do file=$(ls -l $file | sed -n 's/.*-> //p'); done
echo ${file#*.so.}

そのため、私のシステムでは6.0.10が生成されました。

ただし、systemXでコンパイルされたsystemYで動作するバイナリを取得しようとしている場合、これらの種類のものはこれまでのところ取得するだけです。そのような場合、アプリケーションに使用されたlibstdc ++。soのコピーを持ち運び、次に実行するスクリプトを実行します:

export LD_LIBRARY_PATH=<directory of stashed libstdc++.so>
exec application.bin "$@"

通常、アプリケーションのバージョンと互換性がないボックスにある.soの問題を回避します。環境のより極端な違いについては、アプリケーションが正常に動作するまで、すべての依存ライブラリを追加する傾向があります。これは、Windowsでdll hellと見なされるものを回避するためのlinuxの同等物です。

15
Petesh

正確に何を知りたいですか?

共有ライブラリのsoname?これはファイル名の一部であるlibstdc++.so.6、またはreadelf -d /usr/lib64/libstdc++.so.6 | grep sonameで表示されます。

マイナーリビジョン番号?シンボリックリンクが指すものをチェックするだけでそれを取得できるはずです:

$ ls -l  /usr/lib/libstdc++.so.6
lrwxrwxrwx. 1 root root 19 Mar 23 09:43 /usr/lib/libstdc++.so.6 -> libstdc++.so.6.0.16

これは、libstdc++.so.6シンボルバージョンに対応するGLIBCXX_3.4.16バージョンの16番目のリビジョンである6.0.16であることを示しています。

それとも、それが由来するリリースを意味しますか? GCCの一部であるため、GCCと同じバージョンです。したがって、g++libstdc++.soの一致しないバージョンをインストールしてシステムを台無しにしない限り、以下から取得できます。

$ g++ -dumpversion
4.6.3

または、ほとんどのディストリビューションでは、パッケージマネージャーに問い合わせてください。私のFedoraホストでは

$ rpm -q libstdc++
libstdc++-4.6.3-2.fc16.x86_64
libstdc++-4.6.3-2.fc16.i686

他の回答で述べたように、 ABI docs をチェックすることにより、リリースをライブラリバージョンにマッピングできます。

13
Jonathan Wakely

g++ --versionGCC ABI docs と組み合わせて使用​​して調べることができます。

6
Edvard Pedersen