我试图编译的代码示例“SonofGrab”使用的XCode 4.5.1 OS X 10.8。
一个函数的定义是这样的Controller.m或者
inline uint32_t ChangeBits(uint32_t currentBits, uint32_t flagsToChange, BOOL setFlags);
这导致此错误信息:
Undefined symbols for architecture x86_64:
"_ChangeBits", referenced from:
-[Controller awakeFromNib] in Controller.o
[...]
ld: symbol(s) not found for architecture x86_64
删除功能ChangeBits的内联解决了这个问题,但为什么链接器找不到原来的定义Changebits?
这对我来说,看起来像一个错误。 这个简单的例子显示出相同的错误:
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
充分,无论是。 而且也没有在苹果公司编写的示例代码的人!
的inline
对ChangeBits
函数意味着定义仅用于内联到被使用。 这并不是说功能应始终被内联。 必须有另一种,可在应用程序中的其他地方非内联定义,否则是非法的。 因此,链路错误,因为没有非内联ChangeBits
设置。
真正的解决办法是声明ChangeBits
为static inline
,因为这告诉编译器的定义是本地的只有翻译单元,并有不因此需要一个非内联定义。
LLVM的页面上的更多信息我联系,但。 希望帮助!