私は次のコマンドを見つけました:ここstrings /usr/lib/libstdc++.so.6 | grep GLIBC
から。動作しているように見えますが、これはアドホック/ヒューリスティックな方法です。
ライブラリバージョンのC++を照会するために使用できる特定のコマンドはありますか?それとも、受け入れられた方法を見つけた方法ですか?
私は次のコマンドを見つけました:ここstrings /usr/lib/libstdc++.so.6 | grep GLIBC
から。動作しているように見えますが、これはアドホック/ヒューリスティックな方法です。
ライブラリバージョンの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++ バージョンの日付スタンプの表は、ドキュメントに記載されています。
正確に何を知りたいですか?
共有ライブラリ 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 ドキュメントをチェックすることで、リリースをライブラリ バージョンにマップできます。
私がよく使用するメカニズムは、 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です。
GCC ABI docsg++ --version
と組み合わせて使用 して調べることができます。