2010-07-24 3 views
3

J'écris un dylib en C++, mais lorsque je tente de le lier dans ma demande, il me donne une erreur sur l'exécution:symbole Lazy liaison a échoué lors de la liaison bibliothèque dynamique C

dyld: lazy symbol binding failed: Symbol not found: __ZN8Vector2DC1Ev 
    Referenced from: /Users/noahz/Desktop/Singularity/Singularity Test App/build/Debug/Singularity Test App 
    Expected in: /Users/noahz/Desktop/Singularity/Singularity Test App/build/Debug/libSingularity.dylib 

dyld: Symbol not found: __ZN8Vector2DC1Ev 
    Referenced from: /Users/noahz/Desktop/Singularity/Singularity Test App/build/Debug/Singularity Test App 
    Expected in: /Users/noahz/Desktop/Singularity/Singularity Test App/build/Debug/libSingularity.dylib 

Je me suis assuré le symbole n'a pas été dépouillé, et

nm -g libSingularity.dylib | grep "T" | grep __ZN8Vector 

rapports que le symbole est présent dans la bibliothèque:

0000000000006df6 T __ZN8Vector2DC1Eff 
0000000000006d98 T __ZN8Vector2DC1Ev 
0000000000006dc2 T __ZN8Vector2DC2Eff 
0000000000006d6e T __ZN8Vector2DC2Ev 

Je relie fr om à l'intérieur de XCode, donc les commandes de liens sont plutôt bizarres. Voici la commande de liaison pour la dylib:

Ld "/Users/noahz/Desktop/Singularity/Singularity Engine/build/Debug 
    /libSingularity.dylib" normal x86_64 
cd "/Users/noahz/Desktop/Singularity/Singularity Engine" 
setenv MACOSX_DEPLOYMENT_TARGET 10.6 
/Developer/usr/bin/g++-4.2 -arch x86_64 -dynamiclib -isysroot /Develope 
    /SDKs/MacOSX10.6.sdk "-L/Users/noahz/Desktop/Singularity/Singularity Engine/build 
    /Debug" "-F/Users/noahz/Desktop/Singularity/Singularity Engine/build/Debug" 
    -filelist "/Users/noahz/Desktop/Singularity/Singularity Engine/build/Singularity 
    Engine.build/Debug/Singularity Engine.build/Objects-normal/x86_64 
    /libSingularity.LinkFileList" -install_name libSingularity.dylib -mmacosx-version- 
    min=10.6 -framework sfml-system-d -framework sfml-window-d -framework SFML 
    -framework OpenGL -framework OpenAL -framework sfml-graphics-d -single_module 
    -compatibility_version 1 -current_version 1 -o "/Users/noahz/Desktop/Singularity 
    /Singularity Engine/build/Debug/libSingularity.dylib" 

et voici la commande éditeur de liens pour l'application de test:

cd "/Users/noahz/Desktop/Singularity/Singularity Test App" 
setenv MACOSX_DEPLOYMENT_TARGET 10.6 
/Developer/usr/bin/g++-4.2 -arch x86_64 -isysroot /Developer/SDKs/MacOSX10.6.sdk 
    "-L/Users/noahz/Desktop/Singularity/Singularity Test App/build/Debug" "-F/Users 
    /noahz/Desktop/Singularity/Singularity Test App/build/Debug" -filelist "/Users/noahz 
    /Desktop/Singularity/Singularity Test App/build/Singularity Test App.build/Debug 
    /Singularity Test App.build/Objects-normal/x86_64/Singularity Test 
    App.LinkFileList" -mmacosx-version-min=10.6 "/Users/noahz/Desktop/Singularity 
    /Singularity Engine/build/Debug/libSingularity.dylib" -o "/Users/noahz/Desktop 
    /Singularity/Singularity Test App/build/Debug/Singularity Test App" 

Toutes les idées sur pourquoi cela se passe et/ou comment y remédier?

+0

à quoi ressemble le lien cmd line? – Digikata

+0

Pourriez-vous donner plus d'informations sur la phase de compilation et de liaison? – Opera

Répondre

0

je résolu le problème en liant la bibliothèque statique. Ce n'est pas aussi élégant que le lien dynamique était, mais au moins il ne tombe pas en panne à plusieurs reprises.

0

Si votre application diffère dans l'architecture x86/64 de la bibliothèque que vous essayez de charger, cela peut expliquer le problème que vous rencontrez.

Les deux doivent être compilés avec la même architecture.

0

Je ne vois pas une ligne dans votre stade de lien

-lSingularity 

apparemment une autre façon de charger une bibliothèque dynamique est de charger explicity de l'intérieur le code.

gSystem->Load("libSingularity"); 

Je ne fais que paraphraser un article de blog que j'ai trouvé.

http://root.cern.ch/phpBB3//viewtopic.php?f=3&t=10380&start=0

+0

Les bibliothèques SEEM pour lier okay (une autre classe peut être instanciée et utilisée très bien) mais quand je crée un vecteur, il plante. – computergeek6

+0

essayez d'utiliser ldd sur l'exécutable. ldd vous dira où toutes vos bibliothèques dynamiques résolvent. – bradgonesurfing

+0

apparemment, ldd ne fonctionne pas sur MacOS – computergeek6

Questions connexes