J'ai trouvé la commande suivante: strings /usr/lib/libstdc++.so.6 | grep GLIBC
de ici . Cela semble fonctionner, mais il s’agit d’une méthode ad hoc/heuristique.
Existe-t-il une commande spécifique pouvant être utilisée pour interroger la version de bibliothèque de C++? Ou est la méthode j'ai trouvé la méthode acceptée?
Pour trouver quelle bibliothèque est utilisée, vous pouvez exécuter
$ /sbin/ldconfig -p | grep stdc++
libstdc++.so.6 (libc6) => /usr/lib/libstdc++.so.6
La liste des versions compatibles pour libstdc ++ version 3.4.0 et supérieure est fournie par
$ strings /usr/lib/libstdc++.so.6 | grep LIBCXX
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
...
Pour les versions antérieures, le symbole GLIBCPP
est défini.
L’horodatage de la bibliothèque est défini dans une macro __GLIBCXX__
ou __GLIBCPP__
selon la version:
// 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
La table des horodatages des versions de libstdc ++ est listée dans le documentation :
Le mécanisme que j'ai tendance à utiliser est une combinaison de readelf -V
vider le .gnu.version
informations de libstdc ++, puis une table de recherche correspondant au plus grand GLIBCXX_
valeur extraite.
readelf -sV /usr/lib/libstdc++.so.6 | sed -n 's/.*@@GLIBCXX_//p' | sort -u -V | tail -1
si votre version de sort
est trop ancienne pour avoir le -V
_ (qui trie par numéro de version), vous pouvez utiliser:
tr '.' ' ' | sort -nu -t ' ' -k 1 -k 2 -k 3 -k 4 | tr ' ' '.'
à la place du sort -u -V
, pour trier jusqu'à 4 chiffres de version.
En général, faire correspondre la version ABI devrait suffire.
Si vous essayez de retrouver le libstdc++.so.<VERSION>
, cependant, vous pouvez utiliser un peu bash comme:
file=/usr/lib/libstdc++.so.6
while [ -h $file ]; do file=$(ls -l $file | sed -n 's/.*-> //p'); done
echo ${file#*.so.}
donc pour mon système cela a donné 6.0.10
.
Si, toutefois, vous essayez de faire fonctionner un binaire compilé sur systemX sur systemY, ce genre de choses ne vous mènera que jusque-là. Dans ces cas, emportant une copie de libstdc ++. Qui a donc été utilisée pour l'application, puis un script d'exécution qui effectue:
export LD_LIBRARY_PATH=<directory of stashed libstdc++.so>
exec application.bin "$@"
travaille généralement sur la question de l'incompatibilité de la version .so de la boîte avec la version de l'application. Pour des différences d'environnement plus extrêmes, j'ai tendance à simplement ajouter toutes les bibliothèques dépendantes jusqu'à ce que l'application fonctionne correctement. C’est l’équivalent Linux de ce que l’on cherche à faire pour que Windows soit considéré dll hell.
Qu'est ce que tu veux savoir exactement?
La bibliothèque partagée soname? Cela fait partie du nom de fichier, libstdc++.so.6
, ou montré par readelf -d /usr/lib64/libstdc++.so.6 | grep soname
.
Le numéro de révision mineure? Vous devriez pouvoir l'obtenir en vérifiant simplement sur quoi le lien symbolique pointe:
$ 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
Cela vous dit que c'est 6.0.16, qui est la 16ème révision du libstdc++.so.6
version, qui correspond à la GLIBCXX_3.4.16
versions de symboles.
Ou voulez-vous dire la libération dont elle provient? Cela fait partie de GCC, donc c'est la même version que GCC, donc à moins que vous ayez foiré votre système en installant des versions inégalées de g++
et libstdc++.so
vous pouvez l'obtenir auprès de:
$ g++ -dumpversion
4.6.3
Ou, sur la plupart des distributions, vous pouvez simplement demander au gestionnaire de paquets. Sur mon hôte Fedora c'est
$ rpm -q libstdc++
libstdc++-4.6.3-2.fc16.x86_64
libstdc++-4.6.3-2.fc16.i686
Comme d'autres réponses l'ont dit, vous pouvez mapper les versions aux versions de bibliothèque en cochant la documentation ABI
Vous pouvez utiliser g++ --version
en combinaison avec la documentation GCC ABI pour le savoir.