2010-02-18 7 views
5

Im en utilisant Qmake pour construire une bibliothèque partagée sur Ubuntu 9.10problèmes de liaison ld:/usr/bin/ld: ne peut pas trouver [libraryname]

Cette bibliothèque partagée (A) a une dépendance à une autre bibliothèque partagée (B) .

Le projet B a été construit avec succès.

dans le fichier .pro pour le projet A, ma variable LIBS ressemble à ceci:

LIBS += -L../datelib/bin -llibdatelib_release.so.1.0.0 

(j'ai utilisé le nom complet de shlib parce que les versions de la bibliothèque sont différents.)

Dans tous les cas, lorsque je tente de construire le projet A, il se casse à l'étape de liaison, et imprime le message d'erreur:

/usr/bin/ld: cannot find -llibdatelib_release.so.1.0.0 
collect2: ld returned 1 exit status 
make[1]: ***[bin/libprojecta_release.so.6.0.0] Error 1 
make ***[release] Error 2 
Exited with code 2 

dans le message d'erreur, je pensais que ld se plaignait qu'il ne pouvait pas l ocate le fichier libdatelib, donc je l'ai copié manuellement dans/usr/lib/

Cependant, cela n'a pas résolu le problème, et je reçois le même message d'erreur.

Quelqu'un sait comment résoudre ce problème?

[Modifier]

Je suis tout à fait nouveau pour la construction en utilisant gcc. Je sais créer des liens symboliques, mais quels chemins dois-je utiliser pour la commande lnk? Le fichier que je veux lier est dans/home/nom d'utilisateur/travail/cppdev/datelib/bin.

De plus, le système de construction que j'utilise (qmake), crée automatiquement des liens symboliques dans le cadre de la construction, j'ai donc déjà les fichiers suivants dans mon/home/nom d'utilisateur/travail/cppdev/datelib/bin:

  • libdatelib_release.so (lien sym)
  • libdatelib_release.so.1 (lien sym)
  • libdatelib_release.so.1.0 (lien sym)
  • libdatelib_release.so.1.0.0 (lib partagée)

Je pourrais avoir à vous poser une autre question pour expliquer pourquoi il y a tant de liens symboliques (quel est le point?), Et pourquoi je ne peux pas directement relier directement une bibliothèque partagée, mais passer par un lien symbolique. J'ai lu quelques docs en ligne, mais ce que j'ai vu jusqu'ici ressemble plus à un dictum/à une tradition qu'à des raisons techniques réelles. POURQUOI ce niveau d'abstraction est-il requis lors d'une liaison sous Linux?

+0

Je ne suis pas un expert sur la construction et relier sous Linux et ont souvent eu des problèmes similaires à la vôtre. Cependant, ce que je peux faire est de recommander l'excellent article suivant sur le traitement des bibliothèques partagées sur IBM DeveloperWorks: [** _ Disséquer les bibliothèques partagées - Apprenez à connaître votre bibliothèque partagée _ ** (par Peter Seebach)] [seebach]. La section _ "Modifier le chemin de recherche de l'éditeur de liens dynamique" _ pourrait vous intéresser particulièrement. [seebach]: http://www.ibm.com/developerworks/linux/library/l-shlibs.html – stakx

Répondre

9

Vous ne pouvez pas utiliser -l de cette façon. -l ne peut trouver que des choses avec des noms comme libFOO.so, via -lFOO. Vous avez besoin d'un lien symbolique sans le numéro de version si vous voulez le spécifier comme ceci dans la construction.

Quelque chose comme:

ln -s /the/path/to/the/libthing.so.1.0.0 /the/path/to/the/libthing.so 

maintenant -lthing fonctionnera.

+0

Désolé, je suis assez nouveau pour construire sur Linux. Je sais créer des liens symboliques, mais quels chemins dois-je utiliser pour la commande lnk? Le fichier que je veux lier est dans/home/nom d'utilisateur/travail/cppdev/datelib/bin –

3

Le préfixe « lib » est automatiquement ajouté au nom de la bibliothèque - Utilisation:

LIBS += -L../datelib/bin -ldatelib_release.so.1.0.0 
+0

Ce travail dosent pour moi ... –

0

Vous pouvez fournir le chemin complet. à savoir

LIBS += ../datelib/bin/libdatelib_release.so.1.0.0 

Cependant, je vous recommande de faire ce bmargulies suggéré: créer un lien symolic et ajoutez -ldatelib_release

+0

Ce travail dosent pour moi ... –

Questions connexes