Question

C'est peut-être une question stupide, mais si je compile une bibliothèque partagée en utilisant g++ sur une distribution de Linux, puis que je déplace ces bibliothèques en tant que fichiers objets via un lecteur flash vers un autre ordinateur avec exactement la même distribution Linux et la même version de g++, le serai-je toujours ? capable de lier ces bibliothèques dans mes fichiers sources sur la deuxième machine ?

Je demande parce que je n'ai pas les autorisations nécessaires pour installer les bibliothèques nécessaires avant de compiler sur la deuxième machine, il serait donc plus facile pour moi de simplement les compiler sur mon propre ordinateur et de télécharger les fichiers objets compilés via un lecteur flash sur la deuxième machine

Était-ce utile?

La solution

Laissez-moi vous expliquer avec quelques exemples.

supposons que j'ai un nom binaire myapp dans ma machine X et je veux l'exécuter sur une autre machine Y mais quand je cours, ça me montre une erreur comme

./myapp: error while loading shared libraries: libcgicc.so.5: cannot open shared object file: No such file or directory

Cela signifie que j'utilise une bibliothèque qui ne se trouve pas sur l'autre machine.Bien sûr, je pourrais essayer d'installer toutes les mêmes bibliothèques sur Y que sur X.Mais je n'ai pas la permission de le faire.Notre alternative consiste alors à lier statiquement les bibliothèques à notre programme.

Sur Y, exécutez la commande ldd myapp.Cela donnera quelque chose comme :

libpthread.so.0 => /lib/tls/libpthread.so.0 (0xf7f77000)
libdl.so.2 => /lib/libdl.so.2 (0xf7f73000)
libgd.so.2 => /usr/lib/libgd.so.2 (0xf7f26000)
libcgicc.so.5 => not found <------------------------------------//this library missed
libjpeg.so.62 => /usr/lib/libjpeg.so.62 (0xf7f08000)
libpng12.so.0 => /usr/lib/libpng12.so.0 (0xf7ee4000)

Revenons à notre machine à compiler, machine X, et vois quoi ldd myapp dit là pour libcgicc :

libcgicc.so.5 => /usr/lib/libcgicc.so.5 (0xb7f18000)

Donc sur machine X, la bibliothèque que nous voulons se trouve dans /usr/lib.Si nous faisons ls /usr/lib/libcgicc* nous pouvons voir quelles versions de cette bibliothèque sont disponibles.Sur une machine c'est-à-dire :

/usr/lib/libcgicc.a
/usr/lib/libcgicc.la
/usr/lib/libcgicc.so
/usr/lib/libcgicc.so.5
/usr/lib/libcgicc.so.5.0.1

Il existe donc une version statique disponible,libcgicc.a.S'il n'y avait pas un .a version, nous aurions besoin d'en obtenir une debian/ubuntu nous pourrions le retrouver en faisant (en tant que superutilisateur) :

apt-file search libcgicc.a

Maintenant, tout ce que nous devons faire c'est relink notre programme, remplaçant -lcgicc avec /usr/lib/libcgicc.a.Maintenant, quand nous le faisons ldd myapp sur l'une ou l'autre machine, nous n'avons plus de bibliothèques manquantes.

Cependant, cela ne garantit pas que toutes les bibliothèques soient exactement de la même version.Un problème fréquent est libstdc++ pour le code C++.Si vous voyez un message comme celui-ci lorsque vous essayez d'exécuter votre code :

./myapp: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9′ not found (required by ./myapp)

Ensuite, vous avez une incompatibilité de version.Cela peut être réparé par relier statiquement la bibliothèque libstdc++.Vérifiez quelle version de g++ vous utilisez avec g++ –version, puis vérifiez libstdc++.a dans:

/usr/lib/gcc/[platform-name]/[version]

(l'emplacement peut être différent sur votre ordinateur).Une fois que vous avez retrouvé ce fichier, vous pouvez le lier statiquement comme auparavant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top