我正在尝试使用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?
答案 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页面的更多信息。希望有所帮助!