2012-10-11 29 views
22

Tôi đang cố gắng biên dịch mã mẫu "SonofGrab" bằng XCode 4.5.1 trên OS X 10.8.Lỗi liên kết cho các hàm nội tuyến

Một hàm được định nghĩa như thế này trong controller.m

inline uint32_t ChangeBits(uint32_t currentBits, uint32_t flagsToChange, BOOL setFlags); 

Điều này dẫn đến thông báo lỗi này:

Undefined symbols for architecture x86_64: 
"_ChangeBits", referenced from: 
-[Controller awakeFromNib] in Controller.o 
[...] 
ld: symbol(s) not found for architecture x86_64 

Loại bỏ các nội tuyến của ChangeBits chức năng giải quyết vấn đề, nhưng tại sao các linker không tìm thấy Changebits với định nghĩa gốc?

Trả lời

40

Điều đó đối với tôi, trông giống như một lỗi. trường hợp đơn giản này thể hiện các lỗi tương tự:

inline void foo() {} 
int main() { 
    foo(); 
} 

Sản lượng:

$ clang test-inline.c 
Undefined symbols for architecture x86_64: 
    "_foo", referenced from: 
     _main in test-inline-MfUY0X.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

đó đã phải là sai !? Trừ khi tôi hoàn toàn thiếu một cái gì đó về inline.

Edit: Ồ không, chờ đợi, hãy khám phá - http://clang.llvm.org/compatibility.html#inline

Về cơ bản nó xuất hiện tôi không hiểu inline đầy đủ, một trong hai. Và cũng không phải người viết mã mẫu tại Apple!

inline trên chức năng ChangeBits có nghĩa là định nghĩa đó chỉ được sử dụng cho nội tuyến. Không phải là hàm luôn luôn được gạch chân. Phải có một định nghĩa khác, phi tuyến tính có sẵn ở nơi khác trong ứng dụng nếu không nó là bất hợp pháp. Do đó, lỗi liên kết khi không có nội dung không phải là nội tuyến ChangeBits được cung cấp.

Giải pháp thực tế là khai báo ChangeBitsstatic inline vì điều đó cho trình biên dịch biết rằng định nghĩa là cục bộ cho đơn vị dịch đó và do đó không cần định nghĩa không nội tuyến.

Thông tin khác về trang LLVM mà tôi đã liên kết đến. Hy vọng rằng sẽ giúp!

+1

Tôi không nhớ có sự cố này trên OS X 10.7 với cùng mẫu mã. Đã có một số thay đổi trên clang đã phá vỡ mã này? – alecail

+0

Có lẽ vì bạn đã sử dụng GCC hoặc LLVM-GCC trước đây. LLVM-GCC có nghĩa là tương thích với GCC, tức là sản xuất cùng một kết quả. Bây giờ bạn đang sử dụng Clang đầy đủ, bạn đang nhìn thấy lỗi theo điều chính xác được mô tả trong các tài liệu LLVM tôi liên kết đến. – mattjgalloway

+3

Tôi gặp phải vấn đề này và câu trả lời của mattjgalloway đã giải quyết được vấn đề này. Chỉ cần rõ ràng hơn, trong Controller.m, dòng 71, thêm "static" ở phía trước "inline". –

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