2012-10-11 12 views
22

OS X 10.8でXCode 4.5.1を使用してサンプルコード "SonofGrab"をコンパイルしようとしています。関数ChangeBitsのインライン化を削除インライン関数のリンクエラー

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

は、問題を解決しますが、なぜ:

一つの機能は、これは、このエラーメッセージにつながる

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

controller.mで、このように定義されていますリンカは元の定義でChangebitsを見つけられませんか?

答えて

40

それは私にとってはバグのようです。

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

収量:この単純なケースでは、同じエラー発揮

$ 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) 

間違って持っています!?私が完全に何かを逃していない限り、inline

編集:ああ、いや、これをチェックアウト、待つ - http://clang.llvm.org/compatibility.html#inline

基本的には私はどちらか、完全にinlineを理解していない表示されます。また、そのサンプルコードをAppleに書いた人もいませんでした。

inlineは、その定義がインライン化にのみ使用されることを意味します。関数が常にインライン化されるべきではありません。アプリケーションの他の場所で利用可能な別の非インライン定義がなければなりません。それ以外の場合は違法です。したがって、非インラインでないリンクエラーChangeBitsが提供されます。

static inlineと宣言するのは、コンパイラに定義がその翻訳単位だけであり、したがってインラインでない定義である必要がないためです。

私はリンクされているLLVMページの詳細。希望が助けてくれる!

+1

同じコードサンプルでOS X 10.7でこの問題が発生したことは覚えていません。このコードを壊したclangにいくつかの変更がありましたか? – alecail

+0

以前はGCCやLLVM-GCCを使用していた可能性があります。 LLVM-GCCは、GCCと互換性があり、すなわち同じ結果をもたらすことを意味する。今ではClangを完全に使用していますが、リンク先のLLVMドキュメントに記載されているとおりのエラーが表示されます。 – mattjgalloway

+3

私はこの問題に遭遇し、mattjgallowayの答えがそれを解決しました。 Controller.mの71行目の "inline"の前に "static"を追加するだけで、より明確になります。 –

関連する問題