【问题标题】:Linking error for inline functions内联函数的链接错误
【发布时间】:2012-10-02 10:08:46
【问题描述】:

我正在尝试在 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呢?

【问题讨论】:

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


    【解决方案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。在 Apple 编写示例代码的人也没有!

    ChangeBits 函数上的inline 意味着该定义仅用于内联。并不是说该函数应始终内联。在应用程序的其他地方必须有另一个可用的非内联定义,否则它是非法的。因此没有提供非内联ChangeBits 的链接错误。

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

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

    【讨论】:

    • 我不记得使用相同的代码示例在 OS X 10.7 上遇到过这个问题。是否对 clang 进行了一些更改以破坏此代码?
    • 可能是因为您之前使用的是 GCC 或 LLVM-GCC。 LLVM-GCC 旨在与 GCC 兼容,即产生相同的结果。现在您正在完全使用 Clang,您看到的错误与我链接到的 LLVM 文档中描述的内容完全相同。
    • 我遇到了这个问题,mattjgalloway 的回答解决了它。为了更清楚起见,在 Controller.m 第 71 行中,在“inline”前面添加“static”。
    • 当前问题的最佳答案。也来自一位前同事!
    猜你喜欢
    • 2010-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 2011-01-24
    相关资源
    最近更新 更多