web-dev-qa-db-fra.com

Impossible d'ouvrir le fichier d'objet partagé

J'essaie de compiler l'un des projets trouvés ici Adaptateur d'interface USB-I2C/SPI/GPIO.

J'ai téléchargé le i2c_bridge-0.0.1-rc2.tgz paquet. J'ai installé libusb et cela semble bien se passer sans problème. Je vais dans le i2c_bridge-0.0.1-rc2/ répertoire et make. Cela compile. J'entre dans le i2c_bridge-0.0.1-rc2/i2c dossier et faire. Il compile et me donne ./i2c. Cependant, quand je l'exécute, il dit error while loading shared libraries: libi2cbrdg.so: cannot open shared object file: No such file or directory

Le makefile dans i2c_bridge-0.0.1-rc2/i2c a le répertoire de la bibliothèque comme ../. Le libi2cbrdg.so est dans ce répertoire (i2c_bridge-0.0.1-rc2). J'ai également copié le fichier dans /usr/local/lib. Un ls du i2c_bridge-0.0.1-rc2/ le répertoire est

i2c        i2cbrdg.d  i2cbrdg.o  libi2cbrdg.a   Makefile  tests
i2cbrdg.c  i2cbrdg.h  INSTALL    libi2cbrdg.so  README    u2c4all.sh

(Cette i2c est un directeur)

Si je Sudo ./i2c, ça me pose toujours le problème.

J'ai dû enlever le -Werror et -noWdecrepated (orthographe?) Options dans tous les makefiles pour les amener à compiler, mais cela ne devrait pas affecter cela si?

Que faut-il d'autre pour trouver le .so fichier? Si quelqu'un peut m'aider à découvrir ce qui ne va pas, je lui en serais très reconnaissant. Si plus d'informations sont nécessaires, je peux les publier.

16
Sterling

Vous devez faire la distinction entre la recherche de so au moment de la compilation et au moment de l'exécution. L'indicateur -L que vous donnez au moment de la compilation n'a rien à voir avec la localisation de la bibliothèque au moment de l'exécution. Cela se fait plutôt via un certain nombre de variables et certains chemins intégrés dans la bibliothèque.

Le meilleur correctif pour ce problème consiste souvent à définir LD_LIBRARY_PATH dans le répertoire avec le fichier .so, par exemple:

 $ LD_LIBRARY_PATH=.. ./i2c

Pour une solution à long terme, vous devez soit regarder de près l'ensemble LD système avec rpath et runpath, ou utiliser libtool (qui résout ces problèmes pour vous de manière portable).

La copie d'un fichier vers/usr/local/lib est souvent insuffisante car ld met en cache les bibliothèques disponibles, vous devez donc réexécuter ldconfig (en tant que root) après avoir copié une bibliothèque dans/usr/local/lib.

39
thiton

Si vous générez le code à partir de la source qui a besoin de la bibliothèque, vous pouvez mettre le chemin dans lequel se trouve la bibliothèque dans la variable d'environnement LD_RUN_PATH avant la génération, et l'éditeur de liens enregistrera ce chemin dans le binaire, afin qu'il soit automatiquement recherché au bon endroit lors de l'exécution.

Spécifique à Linux: Alternativement, placez la bibliothèque dans /lib, /usr/lib, ou un autre chemin référencé dans votre /etc/ld.so.conf ou ses fragments de configuration importés, puis il vous suffit d'exécuter /sbin/ldconfig pour actualiser le cache des bibliothèques de ld.so (l'éditeur de liens dynamique).

25
rakslice

Cela fonctionne pour mon problème, j'espère que cela aidera n'importe qui.

gcc test.c -Wl,-rpath /usr/local/lib -lfcgi -o test.fcg

Et l'option -Wl,-rpath Est l'astuce clé.

2
terwxqian