8
votes

LDD dit que la bibliothèque n'est pas trouvée par Compile terminée avec succès

Je tente de compiler le projet. Il compile avec succès. Mon Make code> quitte la commande avec un code d'état de 0 code> et aucune erreur n'est affichée.

Toutefois, le projet ne fonctionne pas, et lorsque j'exécute ldd -d code> il montre que j'ai deux bibliothèques non trouvées. P>

...
lrwxrwxrwx 1 Andy Andy    62 May  2 12:30 libtier0_srv.so -> /home/dev/sdks/hl2sdk-ob-valve/lib/linux/libtier0_srv.so
lrwxrwxrwx 1 Andy Andy    64 May  2 12:30 libvstdlib_srv.so -> /home/dev/sdks/hl2sdk-ob-valve/lib/linux/libvstdlib_srv.so
-rw-r--r-- 1 Andy Andy  5444 May  2 11:53 Makefile
...


0 commentaires

4 Réponses :


6
votes

Les fichiers de la bibliothèque sont des objets partagés, ce qui signifie qu'ils ne seront résolus qu'au temps d'exécution. Pour que LDD puisse les trouver (en supposant que Linux ou autre variante UNIX), vous devrez ajouter le chemin des bibliothèques à votre ld_library_path (une autre voie envisage peut être utilisée mais je ne peux pas y penser maintenant), puis LDD devrait être capable de trouver la bibliothèque.


0 commentaires

2
votes

AS @ Divercuba23 mentionné, vous devez ajouter le chemin de chemin Votre bibliothèque est située à votre ld_library_path . Un moyen facile et non permanent de faire cela le spécifie lorsque vous exécutez le programme, comme: xxx

Dans ce cas, la bibliothèque doit être dans le même répertoire que vous exécutez le programme. .

plus généralement: xxx


0 commentaires

14
votes

Je viens de tomber sur ceci, j'ai eu le même problème mais une solution différente.

Utiliser ld_library_path sera en fait du travail. Et c'est bien s'il s'agit de vos propres tests dans votre environnement de construction, mais vous devriez essayer de l'éviter à part un cas comme celui-ci. Voici un article de quelqu'un qui sait beaucoup plus que moi à ce sujet, pourquoi ld_library_path est mauvais:

http://xahlee.info/unixresource_dir/_/ldpath.html

Qu'est-ce qui s'est passé est, comme on peut le voir aussi du fait que définir LD_Library_Path a fonctionné, est qu'à l'exécution, votre programme n'a pas pu trouver la bibliothèque partagée libtier0_srv.so . Au lieu de définir globalement une variable pour tous les programmes visant à regarder / home / dev / sdks / hl2sdk-ob-vanve / lib / linux / Tout d'abord, vous devez ajouter le répertoire au chemin de recherche de la bibliothèque d'exécution. Vous faites cela en passant l'option

-rpath / home / dev / sdks / hl2sdk-ob-vanve / lib / linux /

à ld , la lieur. Vous pouvez le faire avec votre commande gcc que vous avez enregistrée en ajoutant l'option

-WL, -RPath, / home / dev / sdks / hl2sdk-ob-valve / lib / linux / ,

qui indique gcc pour transmettre l'option ci-dessus à ld .


1 commentaires

Oui, c'est mieux que l'approche "Sledgehammer" de la définition d'une variable d'environnement.



0
votes

Votre fichier de sortie est * .SO, un fichier de bibliothèque d'objets partagés; Les symboles d'une autre bibliothèque partagée sont référencés mais non importés (lien statique).
- Utilisez nm pour voir les symboles (définis ou indéfinis)
LDD recherchera le cache du système LDConfig et /etc/ld.so.conf informe où rechercher - Vous pouvez utiliser cette fonctionnalité pour ajouter des chemins de bibliothèque (exemple: / opt / valve / lib) à partager avec tous les utilisateurs.
- Votre commande Compile comprend des archives de la bibliothèque partagée de votre répertoire personnel.
---- LDD ne recherchera pas normalement les annuaires de la maison, utilisez ld_library_path
------ Mais vous devez énumérer le chemin complet de l'annuaire
Vous avez dit que vous «inclus» mathlib, je vois que c'était comme -i (pour les fichiers d'en-tête)
- Mais les répertoires de la bibliothèque sont -l $ my_path / mathlib / lib et -l vstdlib_srv liens
----- Vous avez inclus la bibliothèque plutôt que de le lier - En C / C ++, le sens de l'inclusion est différent, puis d'autres langues: utilisation / exiger / importer / incluent
---- Cela décrit des symboles, des types et des listes de paramètres param. mais pas la mise en œuvre
-Je fournit le chemin de * .h, * .hh, * .HPP; qui sont des fichiers texte pour déclarer symboles
-L fournit le chemin d'accès à la recherche de bibliothèques (et de libs statiques pour lier l'exécutif)
-L liens une bibliothèque contenant la mise en œuvre
-RPATH fournit le chemin d'exécution des libs de lien vers l'exécutif et la compilez dans l'exécutif
---- Ceci lie l'application et son emplacement de la bibliothèque (exemple -RPath ../lib, lorsque l'application est à la corbeille)


0 commentaires