2010-03-30 25 views
6

Próbuję połączyć moją aplikację Mac do wspaniałej biblioteki libancillary. Jednak zmieniłem skrypt kompilacji biblioteki, aby utworzyć wspólną bibliotekę. Mogę sprawdzić symbole w tej bibliotece przy użyciu nm libancillary.dylib - wynik jest:ld zgłasza brakujące symbole, ale symbole wydają się istnieć

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 

Jednak gdy próbuję i połączyć mój wniosek, wyjście pojawia się:

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 

(I edycja tego nieznacznie, aby usunąć bardzo długą listę plików obiektów).

Co może spowodować zawieszenie tego połączenia? Symbol istnieje i jest jawny, i nie ma błędu, że nie można znaleźć biblioteki ani żadnych innych komunikatów o błędach.

+0

Podobne pytanie tutaj: http://stackoverflow.com/questions/942754/nm-reports-symbol-is-defined-but-ldd-reports-symbol-is-undefined Tyle że mój symbol jest wyświetlany jako publiczny. – Thomi

+0

Czy nie musisz używać nm-D, aby zobaczyć dynamicznie połączone symbole, czy też działa to inaczej na osx, w porównaniu z linuxem? –

Odpowiedz

7

Te symbole to nieuszkodzone symbole C. Jak oznaczyłeś to jako C++, zakładam, że kompilujesz się z C++. Jeśli tak, że może trzeba owinąć biblioteki header pliki w extern bloku w kodzie:

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

gdzie library.h to nazwa nagłówka pliku (ów) biblioteki, aby zabezpieczyć je przed zniekształceniem w kod wywołujący.

+0

Doh - Powinienem był o tym pomyśleć. Dzięki. – Thomi

1

Zastanawiam się, czy jest to problem z wymazywaniem C++?

Spróbuj uruchomić plik nm w pliku utils.o i zobaczyć symbol, którego faktycznie szuka.

Być może trzeba będzie zawinąć nagłówek w extern C.