76

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

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

4

4 に答える 4

89

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

 $ /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++ バージョンの日付スタンプの表は、ドキュメントに記載されています。

于 2012-04-27T17:28:54.873 に答える
21

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

共有ライブラリ 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に対応するバージョンの 16 番目のリビジョンである 6.0.16 であることを示しています。GLIBCXX_3.4.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 ドキュメントをチェックすることで、リリースをライブラリ バージョンにマップできます。

于 2012-07-28T22:20:49.110 に答える
16

私がよく使用するメカニズムは、 libstdc ++から情報readelf -Vをダンプすることと、抽出され.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>、次のような小さなバッシュを使用できます。

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の場合、 dllhellと見なされるものを回避するのと同等のLinuxです。

于 2012-04-27T19:30:49.823 に答える
8

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

于 2012-04-27T16:54:16.087 に答える