2009-09-01 33 views
5

hej.hObjective-C++ biểu tượng không được tìm thấy lạ

void hej(); 

hej.m

void hej(){} 

main.mm

#import "hej.h" 

int main(int argc, char *argv[]) 
{ 

} 

này mang lại cho tôi:

"hej() ", được tham chiếu từ: _chính trong main.o (các) biểu tượng không được tìm thấy

Nếu tôi đổi tên main.mm thành main.m (đơn m) hoặc hej.m thành mm hoặc cpp thì nó hoạt động. Hãy tưởng tượng bạn muốn sử dụng một c-lib trong môi trường objC++ - bạn sẽ không muốn thay đổi toàn bộ lib, thậm chí không thể, và bạn cần sử dụng nó trong objC++.)

Chính xác những gì đang xảy ra ở đây?

+0

Mục tiêu-C++ là giao diện người dùng có thể biên dịch tệp nguồn sử dụng kết hợp cú pháp C++ và Objective-C? –

Trả lời

17

Khi được biên soạn trong tệp C (*.c, *.m), khai báo void hej() tạo liên kết tham chiếu tới hàm C có tên _hej. Khi được biên dịch trong một tệp C++ (*.cc, *.mm,, v.v.), khai báo tạo ra một trình liên kết tham chiếu tới tên bị xáo trộn của C++, bao gồm trong đó một mô tả về các đối số. (Việc này được thực hiện để hỗ trợ quá tải hàm, ví dụ: để phân biệt void hej(int) từ void hej(char*)). hej.m luôn tạo tên C. Khi main.mm tham chiếu đến tên C++, nó sẽ không được tìm thấy.

Để giải quyết, hãy đảm bảo main.mm tìm kiếm tên C chứ không phải tên C++. Nếu bạn kiểm soát hej.h, nó phổ biến để thêm một cái gì đó như sau, mà sẽ làm việc khi hej.h được bao gồm trong hoặc là một C hoặc C++ file:

/* hej.h */ 
#ifdef __cplusplus 
extern "C" { 
#endif 

void hej(); 

#ifdef __cplusplus 
} 
#endif 

Nếu bạn làm hej.h không phải của riêng, bạn có thể làm như sau trong main.mm thay thế:

extern "C" { 
#import "hej.h" 
} 

int main(int argc, char *argv[]) 
{ 
} 
Các vấn đề liên quan