2010-03-30 10 views
6

Tôi đang cố liên kết ứng dụng mac của mình với thư viện tuyệt vời libancillary. Tuy nhiên, tôi đã thay đổi kịch bản xây dựng thư viện để tạo một thư viện được chia sẻ. Tôi có thể kiểm tra các biểu tượng trong thư viện này sử dụng nm libancillary.dylib - kết quả là:báo cáo ld thiếu biểu tượng, nhưng các ký hiệu dường như tồn tại

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 

Tuy nhiên, khi tôi cố gắng và liên kết ứng dụng của tôi, kết quả tôi nhận được là:

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 

(Tôi đã chỉnh sửa này một chút để loại bỏ danh sách các tệp đối tượng rất dài).

Điều gì có thể khiến liên kết này không thành công? Biểu tượng tồn tại và được công khai và không có lỗi về việc không thể tìm thấy thư viện hoặc bất kỳ thông báo lỗi nào khác.

+0

câu hỏi tương tự ở đây: http://stackoverflow.com/questions/942754/nm-reports-symbol-is-defined-but-ldd-reports-symbol-is-undefined Trừ rằng biểu tượng của tôi được hiển thị công khai. – Thomi

+0

Bạn không phải sử dụng nm-D để xem các biểu tượng được liên kết động, hay nó hoạt động khác trên OSX, so với Linux? –

Trả lời

7

Các ký hiệu đó là các biểu tượng C không bị xáo trộn. Như bạn đã gắn thẻ này là C++, tôi cho rằng bạn đang biên dịch với C++. Nếu bạn làm điều đó bạn có thể cần phải quấn thư viện của bạn tiêu đề tập tin trong một khối extern trong mã của bạn:

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

nơi library.h là tên của tập tin tiêu đề của thư viện (s), để ngăn chặn chúng bị lẫn lộn trong mã gọi.

+0

Doh - Tôi nên nghĩ về điều đó. Cảm ơn. – Thomi

1

Tôi tự hỏi đó có phải là vấn đề mang tên C++ không?

Thử chạy nm trên tệp utils.o và xem biểu tượng thực sự đang tìm kiếm.

Bạn có thể phải quấn tiêu đề trong extern C.