2010-08-12 15 views
5

Donc, je construis un projet, et il utilise des fonctions d'une bibliothèque compilée (.dylib ou .so). Je les en-têtes et les fichiers de bibliothèque (tout cela fait partie de QtRoot, d'ailleurs) dans des endroits appropriés, mais lorsque je tente de construire mon projet Xcode, je reçois une erreur de débogage:La liaison est activée. Qu'est-ce que -rpath? MacOS X

dyld: Library not loaded: @rpath/libRIO.so Referenced from: /Users/paulthompson/Documents/Programming/Build Products/Debug/MacHeliosSim.app/Contents/MacOS/MacHeliosSim Reason: image not found sharedlibrary apply-load-rules all Data Formatters temporarily unavailable, will re-try after a 'continue'. (Cannot call into the loader at present, it is locked.)

Maintenant, le programme lui-même qui est construit fonctionnera très bien si je l'ouvre à partir du Finder, mais chaque fois que j'essaie de l'exécuter à partir de Xcode, il barfs à moi. Quelle est cette chose de rpath, et pourquoi le débogueur ne peut-il pas trouver les bibliothèques, même si Xcode lui-même sait où elles sont, et apparemment le programme lorsqu'il est lancé depuis le Finder peut les trouver aussi?

Répondre

3

http://en.wikipedia.org/wiki/Rpath_(linking)

Il est un chemin stocké dans le binaire pour trouver libs partagées. Lorsque vous démarrez l'application à partir du Finder, il s'agit probablement d'un ensemble d'applications? Lorsque des regroupements d'applications sont créés, les bibliothèques partagées sont copiées dans le regroupement d'applications et les chemins d'accès aux bibliothèques groupées deviennent alors relatifs. (@executable_path /../ Frameworks/foobar). Comment avez-vous créé la version qui fonctionne avec Finder? L'erreur ci-dessus se produit-elle au moment de la liaison ou lors du démarrage de l'application à partir de xcode?

(Dans ce dernier cas, essayez avec DYLD_LIBRARY_PATH)

De plus, l'extension .so pour libRIO au lieu de .dylib semble un peu suspecte.

+0

Vous avez manqué la parenthèse fermante sur votre lien. –

+0

Correct, il s'agit d'un ensemble .app. Cependant, aucune des bibliothèques partagées ne s'y trouve, à moins qu'elles ne soient enveloppées dans le binaire actuel. Il n'y a même pas de répertoire de frameworks ... Quoi qu'il en soit, le .app est créé en faisant 'build' ou 'build and go' à partir de Xcode. L'erreur surgit pendant la partie go de 'build & go' ou si je choisis de courir depuis Xcode. Le .so, je pense, est en fait un lien symbolique vers le .dylib. Certains des fichiers de bibliothèque auxquels je suis lié sont des fichiers .so réels, et d'autres sont .dylib. Je pense qu'il y a même quelque chose là-dedans quelque part, mais je peux me tromper. Donc, suis-je perhapse manquant un – TraxusIV

+0

copier des fichiers phase de construction? – TraxusIV

1

Ajouter le rpath dans la phase de liaison, comme dans ce (en créateur qt) Exemple:

LIBS += -L/usr/local/root/lib -lGui -lCore -lCint -lRIO -lNet -lHist -lGraf -lGraf3d -lGpad -lTree -lRint -lPostscript -lMatrix -lPhysics -lMathCore -lThread -lpthread -Wl,-rpath,/usr/local/root/lib -lm -ldl