2013-05-24 31 views
7

vấn đề đơn giản:Simple C lỗi inline mối liên kết

cho chương trình sau đây:

#include <stdio.h> 

inline void addEmUp(int a, int b, int * result) 
{ 
    if (result) { 
     *result = a+b; 
    } 
} 

int main(int argc, const char * argv[]) 
{ 
    int i; 
    addEmUp(1, 2, &i); 

    return 0; 
} 

tôi nhận được một lỗi mối liên kết ...

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

vẻ như nó không bận tâm biên dịch nó.

nó không nên cần phải static, tôi sẽ không nghĩ rằng, dựa trên những gì tôi đã đọc trong:
Linker error inline function (vì đây là trong một đối tượng khác nhau, và đối phó với 2 định nghĩa chứ không phải là zero)

Đây là một liên kết có liên quan, nhưng nó là C++ và tôi không nghĩ rằng đó là thực hành tốt trong std C để đặt mã trong tiêu đề:
inline function linker error

thông tin biên dịch:

cc --version 
Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn) 
Target: x86_64-apple-darwin12.3.0 
Thread model: posix 

biên soạn dụ:

# cc main.c 
Undefined symbols for architecture x86_64: 
    "_addEmUp", referenced from: 
     _main in main-sq3kr4.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocatio 
+0

lệnh nào bạn đã sử dụng để biên dịch? –

+0

Bạn đang sử dụng trình biên dịch nào? – Evans

+0

nó là clang trong xcode 4.6.2 –

Trả lời

11

khoản 7 mục 6.7.4 nói:

Bất kỳ chức năng với liên kết nội bộ có thể là một chức năng inline. Đối với một hàm có liên kết bên ngoài, các hạn chế sau được áp dụng: Nếu hàm được khai báo với một chỉ định hàm inline, thì nó cũng sẽ được định nghĩa trong cùng một đơn vị dịch. Nếu tất cả các khai báo phạm vi tệp cho một hàm trong đơn vị dịch bao gồm thông số chức năng inline mà không có extern thì định nghĩa trong đơn vị dịch đó là định nghĩa nội tuyến . Định nghĩa nội tuyến không cung cấp định nghĩa bên ngoài cho hàm và không cấm định nghĩa bên ngoài trong một đơn vị dịch khác. Định nghĩa nội tuyến cung cấp giải pháp thay thế cho định nghĩa bên ngoài, mà người dịch có thể sử dụng để thực hiện bất kỳ lệnh gọi nào đến hàm trong cùng một đơn vị dịch. Không xác định liệu cuộc gọi đến hàm có sử dụng định nghĩa nội tuyến hay định nghĩa bên ngoài hay không.

Tệp của bạn không chứa định nghĩa bên ngoài là addEmUp và trình biên dịch đã chọn sử dụng định nghĩa bên ngoài trong cuộc gọi main.

Cung cấp định nghĩa bên ngoài hoặc khai báo là static inline.

+0

nội tuyến tĩnh không hoạt động (ít nhất là không có trong dự án thực; không thử mẫu một) ... Tôi tìm thấy macro Mục tiêu-C cụ thể hoạt động, tôi đang trong quá trình đang cập nhật. Tuy nhiên, –

+0

'static inline' _ought_ để hoạt động. Bạn có thể đun sôi nó xuống đủ xa mà lỗi liên kết vẫn còn nhưng mã là đủ nhỏ cho SO? –

+0

có nó hoạt động trong mẫu. upvote và trả lời! –

3

thử thêm "-O" tùy chọn để chỉ huy biên dịch của bạn. Nội tuyến chỉ được bật khi tối ưu hóa được bật.

+0

mà không có lỗi linker đi, nhưng không nên nó chỉ bỏ qua các từ khóa nếu nó không thể nội tuyến ... vì nó chỉ là một gợi ý anyway –

+0

Đó là những gì GCC làm. Clang cố gắng tuân thủ C99, có cách giải thích hơi khác một chút, đó là lý do tại sao bạn đang gặp phải vấn đề này. http://clang.llvm.org/compatibility.html # inline – Ziffusion

+0

nghiên cứu tốt +1 –

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