2012-02-17 26 views
26

Tôi gặp sự cố liên kết lạ. Tôi có mã trông giống như vậy:Lỗi trình kết nối gọi C-Chức năng từ Mục tiêu-C++

double given_amount = self.modelController.levelCompleteRewardAmount; 
    swrve_currency_given(swrve, (CFStringRef)@"currencyName", given_amount); 

Tôi có mã này ở hai nơi riêng biệt: Trong tệp mục tiêu-c và mục tiêu-C++. Nó biên dịch tốt ở đất khách quan-C, nhưng swrve_currency_given() chức năng gây ra sau đây trong tập tin WGController.mm tôi:

Undefined symbols for architecture armv7: 
    "swrve_currency_given(Swrve*, __CFString const*, double)", referenced from: 
     -[WGController giveTheUserSomeCashForPlayingThisLevel] in WGController.o 
ld: symbol(s) not found for architecture armv7 
collect2: ld returned 1 exit status 

Tôi không hoàn toàn chắc chắn nếu lỗi này có liên quan đến obj-C vs Điều C++, nhưng nó cảm thấy thích nó. Lý thuyết của tôi là nó có lẽ nghĩ rằng nó là một chức năng trên lớp Obj-C? Mã 'swrve' là mã bên thứ 3, một .h và file .c và tôi đang nhập khẩu như sau:

#import "swrve.h"

Any help is appreciated! Cảm ơn

+0

Bạn cũng nhập khẩu nó trong dự án cho các mối liên kết? Đi đến các thuộc tính của mục tiêu của bạn và mở "Khung và Thư viện được Liên kết" trên trang tóm tắt. Thư viện 'swrve' nên ở đó; nếu không, hãy thêm nó và thử biên dịch lại. – dasblinkenlight

+0

Thư viện không phải là một lib/framework tĩnh, nó chỉ là một tệp .c và .h. (tôi đã cập nhật câu hỏi của mình để phản ánh điều đó). –

Trả lời

45

Bạn có thể cần phải bao quanh chức năng nguyên mẫu với:

#if defined __cplusplus 
extern "C" { 
#endif 

void swrve_currency_given (...whatever goes here...); 

#if defined __cplusplus 
}; 
#endif 

Điều đó nói với trình biên dịch rằng đó là một chức năng C và không phải là một hàm C++.

+0

Có vẻ như nó đã hoạt động, nhưng cậu bé đó là rất nhiều tấm nồi hơi để thêm! Cảm ơn! –

+0

Tôi đã thêm một biến thể bằng cách sử dụng biến thể cú pháp 'extern" C "' không có phạm vi khối, mà tôi thấy hơi sạch hơn vì bạn chỉ phải thực hiện công việc soạn sẵn một lần. Đó là một chút quá lớn cho một bình luận, nhưng chỉnh sửa hy vọng sẽ được phê duyệt sớm. – pmdj

9

Nếu bạn đang sử dụng hàm c trong tệp C++. bạn nên sử dụng extern "c"{}. Trong file .h

#ifdef __cplusplus 
extern "C" { 
#endif 

swrve_currency_given(parameter1, parameter2, parameter3);// a c function 


#ifdef __cplusplus 
} 
#endif 

extern "C" có nghĩa là để được công nhận bởi một trình biên dịch C++ và thông báo cho trình biên dịch rằng chức năng ghi nhận là (hoặc được) biên soạn trong C phong cách.

Nếu bạn đang liên kết đến thư viện được biên dịch dưới dạng mã C. sử dụng

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

Hãy xem When to use extern "C" in C++?

Các vấn đề liên quan