内联函数链接错误(Linking error for inline functions)

2019-08-01 08:54发布

我试图编译的代码示例“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?

Answer 1:

这对我来说,看起来像一个错误。 这个简单的例子显示出相同的错误:

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充分,无论是。 而且也没有在苹果公司编写的示例代码的人!

inlineChangeBits函数意味着定义仅用于内联到被使用。 这并不是说功能应始终被内联。 必须有另一种,可在应用程序中的其他地方非内联定义,否则是非法的。 因此,链路错误,因为没有非内联ChangeBits设置。

真正的解决办法是声明ChangeBitsstatic inline ,因为这告诉编译器的定义是本地的只有翻译单元,并有不因此需要一个非内联定义。

LLVM的页面上的更多信息我联系,但。 希望帮助!



文章来源: Linking error for inline functions