链接内联函数的错误

时间:2012-10-11 16:57:41

标签: objective-c xcode linker clang osx-mountain-lion

我正在尝试使用OS X 10.8上的XCode 4.5.1编译示例代码“SonofGrab”。

在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?

1 个答案:

答案 0 :(得分:42)

那对我来说,看起来像个臭虫。这个简单的案例表现出同样的错误:

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表示该定义仅用于内联。并不是说应该总是内联函数。在应用程序的其他地方必须有另一个非内联定义,否则它是非法的。因此链接错误没有提供非内联ChangeBits

真正的解决方案是将ChangeBits声明为static inline,因为它告诉编译器该定义仅对该转换单元是本地的,因此不需要是非内联定义。< / p>

有关我链接到的LLVM页面的更多信息。希望有所帮助!

相关问题