2010-03-30 4 views
6

J'essaie de lier mon application mac à la magnifique bibliothèque libancillary. Cependant, j'ai changé le script de construction de bibliothèque pour créer une bibliothèque partagée. Je peux inspecter les symboles dans cette bibliothèque à l'aide nm libancillary.dylib - le résultat est:ld signale des symboles manquants, mais des symboles semblent exister

libancillary.dylib(single module): 
     U ___sF 
     U __keymgr_get_and_lock_processwide_ptr 
     U __keymgr_get_and_lock_processwide_ptr_2 
     U __keymgr_set_and_unlock_processwide_ptr 
     U _abort 
00002cfe T _ancil_recv_fd 
00002c87 T _ancil_recv_fds 
00002b6a T _ancil_recv_fds_with_buffer 
00002e9e T _ancil_send_fd 
00002e27 T _ancil_send_fds 
00002d3f T _ancil_send_fds_with_buffer 
     U _calloc 
     U _dlopen 
     U _dlsym 
     U _fflush 
     U _fprintf 
     U _free 
     U _malloc 
     U _recvmsg 
     U _sendmsg 

Cependant, quand je tente de lier ma demande, la sortie que je reçois est:

g++ -headerpad_max_install_names -framework AppKit -framework Cocoa -framework IOKit -framework CoreFoundation -framework Carbon -framework OpenGL -framework SystemConfiguration -framework Security -Wl,-bind_at_load -arch i386 -o MyApp build/app.o build/client.o build/util.o -F/Library/Frameworks -L/Library/Frameworks -L../ancillary -lancillary 
Undefined symbols: 
    "ancil_recv_fd(int, int*)", referenced from: 
     CIPCUnixUtils::readFD(int, int&) constin utils.o 
    "ancil_send_fd(int, int)", referenced from: 
     CIPCUnixUtils::writeFD(int, int) constin utils.o 
ld: symbol(s) not found 
collect2: ld returned 1 exit status 
make: *** [ABClient] Error 1 

(j'ai édité cette légèrement pour supprimer la très longue liste de fichiers objets).

En quoi ce couplage pourrait-il échouer? Le symbole existe et est public, et il n'y a aucune erreur à ne pas pouvoir trouver la bibliothèque, ou tout autre message d'erreur.

+0

question similaire ici: http://stackoverflow.com/questions/942754/nm-reports-symbol-is-defined-but-ldd-reports-symbol-is-undefined Sauf que mon symbole apparaît comme étant public. – Thomi

+0

Vous ne devez pas utiliser nm -D pour voir des symboles liés dynamiquement, ou cela fonctionne-t-il différemment sur osx, comparé à linux? –

Répondre

7

Ces symboles sont des symboles C non démélés. Comme vous l'avez étiqueté comme C++, je suppose que vous compilez avec C++. Si vous faites cela, vous devrez peut-être pour envelopper vos bibliothèques en-tête des fichiers dans un bloc extern dans votre code:

extern "C" { 
#include "library.h" 
} 

où library.h est le nom du fichier d'en-tête de la bibliothèque (s), pour les empêcher d'être tronquées de le code appelant.

+0

Doh - J'aurais dû y penser. Merci. – Thomi

1

Je me demande si c'est un problème de nom-mangling C++? Essayez de lancer nm sur le fichier utils.o, et voyez quel symbole il recherche réellement.

Vous devrez peut-être envelopper l'en-tête dans extern C.

Questions connexes