web-dev-qa-db-fra.com

Comment trouvez-vous quelle version de la bibliothèque libstdc ++ est installée sur votre machine Linux?

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?

62
Trevor Boyd Smith

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 :

72
Dmitri Chubarov

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.

15
Petesh

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

13
Jonathan Wakely

Vous pouvez utiliser g++ --version en combinaison avec la documentation GCC ABI pour le savoir.

6
Edvard Pedersen