ld сообщает об отсутствующих символах, но символы, кажется, существуют

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

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

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

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

6
задан Thomi 30 March 2010 в 08:37
поделиться

2 ответа

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

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

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

7
ответ дан 16 December 2019 в 21:37
поделиться

Интересно, это проблема с изменением имен C ++?

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

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

1
ответ дан 16 December 2019 в 21:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: