2010-03-30 14 views
6

Estoy intentando vincular mi aplicación mac a la maravillosa biblioteca libancillary. Sin embargo, he cambiado el script de construcción de la biblioteca para crear una biblioteca compartida. Puedo inspeccionar los símbolos de esta biblioteca mediante nm libancillary.dylib - el resultado es:ld informa que faltan símbolos, pero los símbolos parecen existir

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 

Sin embargo, cuando intento vincular mi solicitud, la salida que recibo es:

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 

(He editado este ligeramente para eliminar la larga lista de archivos de objetos).

¿Qué podría hacer que fallara este enlace? El símbolo existe, y es público, y no hay ningún error acerca de no poder encontrar la biblioteca o cualquier otro mensaje de error.

+0

pregunta similar aquí: http://stackoverflow.com/questions/942754/nm-reports-symbol-is-defined-but-ldd-reports-symbol-is-undefined Excepto que se muestra mi símbolo como ser público. – Thomi

+0

¿No tiene que usar nm -D para ver símbolos vinculados dinámicamente, o funciona de manera diferente en osx, en comparación con Linux? –

Respuesta

7

Esos símbolos son símbolos C no enmangos. Como ha etiquetado esto como C++, supongo que está compilando con C++. Si lo hace puede que tenga que ajustar sus bibliotecas de archivos de cabecera en un bloque extern en el código:

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

donde library.h es el nombre del archivo de cabecera de la biblioteca (s), para evitar que sean modificadas en el código de llamada.

+0

Doh - Debería haberlo pensado. Gracias. – Thomi

1

Me pregunto si se trata de un problema de manipulación de nombres en C++?

Pruebe ejecutar nm en el archivo utils.o, y vea qué símbolo está buscando en realidad.

Es posible que tenga que ajustar el encabezado en extern C.

Cuestiones relacionadas