次のコマンドを見つけました:strings /usr/lib/libstdc++.so.6 | grep GLIBC
from here 。うまくいくようですが、これはアドホック/ヒューリスティックな方法です。
ライブラリバージョンのC++を照会するために使用できる特定のコマンドはありますか?または、私が受け入れた方法を見つけた方法ですか?
使用されているライブラリを見つけるには、実行することができます
$ /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 にリストされています。
私が使用する傾向があるメカニズムは、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の同等物です。
正確に何を知りたいですか?
共有ライブラリの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 をチェックすることにより、リリースをライブラリバージョンにマッピングできます。
g++ --version
を GCC ABI docs と組み合わせて使用して調べることができます。