2010-03-30 12 views
6

Sto provando a collegare la mia applicazione mac alla meravigliosa libreria libancillary. Tuttavia, ho modificato lo script di creazione della libreria per creare una libreria condivisa. Posso ispezionare i simboli di questa libreria utilizzando nm libancillary.dylib - il risultato è:ld segnala simboli mancanti, ma i simboli sembrano esistere

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 

Tuttavia, quando provo e collego la mia domanda, l'output che ottengo è:

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 

(Ho modificato questo leggermente per rimuovere la lunga lista di file oggetto).

Cosa potrebbe causare il mancato funzionamento di questo collegamento? Il simbolo esiste ed è pubblico e non ci sono errori nel non riuscire a trovare la libreria o altri messaggi di errore.

+0

domanda simile qui: http://stackoverflow.com/questions/942754/nm-reports-symbol-is-defined-but-ldd-reports-symbol-is-undefined Se non fosse che il mio simbolo viene visualizzato come pubblico. – Thomi

+0

Non devi usare nm -D per vedere i simboli collegati dinamicamente, o funziona diversamente su osx, rispetto a linux? –

risposta

7

Quei simboli sono unmangled simboli C. Come hai taggato questo come C++, presumo che tu stia compilando con C++. Se lo fai, potrebbe essere necessario avvolgere le librerie di intestazione file in un blocco extern nel codice:

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

dove library.h è il nome del file di intestazione della biblioteca (s), per evitare che vengano alterati al il codice chiamante.

+0

Doh - Avrei dovuto pensarci. Grazie. – Thomi

1

Mi chiedo se si tratta di un problema di manomissione del nome in C++?

Provare a eseguire nm sul file utils.o e vedere quale simbolo effettivamente sta cercando.

Potrebbe essere necessario avvolgere l'intestazione in extern C.