目标C:内联函数 - 未找到符号

Dan*_*iel 12 compiler-construction symbols inline objective-c

我有一个使用内联C函数的库,编译得很好.当另一个库引用该库时,它仍然编译好.但是如果一个实际的应用程序引用了库,它就无法编译,说_functionNameHere(是的,函数名以下划线开头) - 符号未找到.

如果我删除内联说明符,它编译都很好.但只要函数在库中内联,app就无法编译!

有什么想法是为什么?

我对编译器非常了解,但我对Objective-C不熟悉,而我所知道的任何东西都只是有根据的猜测.即便如此,我也无法想到它会以这种方式表现的原因.

问题是,内联函数是INLINE,这意味着根本没有符号,无论在何处调用它都是内联编译的,并且引用应用程序甚至不应该知道它曾经存在过.只要内联函数始终是内联函数并且对库是私有的,并且没有特殊的编译器配置阻止内联,并且所有这些都是正确的,这是正确的.

所以,任何人都应该指出我正在做什么/想错了......

谢谢 :-)

Arr*_*rix 36

如果该函数仅用于同一个翻译单元(内部链接),则应将静态说明符添加到内联函数定义中,

static inline int add(int x, int y) {return x+y;}
int s = add(1, 2);
Run Code Online (Sandbox Code Playgroud)

如果在上面的示例中省略了静态(在Debug配置中,没有执行优化且没有执行内联),链接器将退出并显示错误抱怨_add被引用但找不到符号.

在C99中,没有任何存储说明符的内联函数声明不会生成实际的可调用函数体,因此链接器在需要时会发出错误.

如果你的内联函数可能被其他模块使用,那就更复杂了.通常的做法是在头文件中包含内联函数定义(不带extern),并且在一个模块中只包含一个extern的原型声明.

一篇很好的文章解释了C99中的内联函数:http://www.drdobbs.com/184401540