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.
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.
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).
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é.