2010-03-30 3 views
6

Я пытаюсь связать свое приложение mac с замечательной библиотекой libancillary. Тем не менее, я изменил скрипт сборки библиотеки для создания общей библиотеки. Я могу проверить символы в этой библиотеке с помощью nm libancillary.dylib - результат:ld сообщает отсутствующие символы, но символы, кажется, существуют

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 

Однако, когда я пытаюсь связать мое приложение, выход я получаю:

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 

(я редактировал этот немного, чтобы удалить очень длинный список объектных файлов).

Что может привести к сбою этой связи? Символ существует и является общедоступным, и нет ошибки в том, что вы не можете найти библиотеку или какие-либо другие сообщения об ошибках.

+0

Похожий вопрос здесь: http://stackoverflow.com/questions/942754/nm-reports-symbol-is-defined-but-ldd-reports-symbol-is-undefined Кроме того, что показан мой символ как общественность. – Thomi

+0

Вам не нужно использовать nm -D для просмотра динамически связанных символов или же он работает по-разному в osx по сравнению с linux? –

ответ

7

Эти символы не имеют символов C. Поскольку вы отметили это как C++, я предполагаю, что вы компилируете с C++. Если вы сделаете это вы, возможно, потребуется, чтобы обернуть ваши библиотеки файлы заголовков в экстерном блока в коде:

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

где library.h это имя заголовочного файла библиотеки (ы), чтобы предотвратить их искажаться вызывающий код.

+0

Doh - Я должен был подумать об этом. Благодарю. – Thomi

1

Я задаюсь вопросом, является ли это проблемой с именем C++?

Попробуйте запустить nm на файл utils.o и посмотреть, что именно символ на самом деле ищет.

Возможно, вам придется обернуть заголовок в extern C.

Смежные вопросы