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

问题描述 投票:0回答:2

我有一个使用内联 C 函数的库, 并且编译得很好。 当另一个库引用该库时,它仍然可以正常编译。 但是,如果实际的应用程序引用该库,则无法编译,并表示找不到 _functionNameHere(是的,函数名称以下划线开头)- 符号。

如果我删除内联说明符,一切都可以正常编译。但只要函数内联在库中,应用程序就无法编译!

有什么想法可以解释为什么会这样吗?

我对编译器非常了解,但对 Objective-C 还很陌生,我对它的了解只不过是有根据的猜测。即使这样,我也想不出它会这样做的原因。

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

所以,请任何人过来指出我正在做/想的错误......

objective-c inline symbols
2个回答
36
投票

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

static inline int add(int x, int y) {return x+y;}
int s = add(1, 2);

如果在上面的示例中省略static(在调试配置中,不执行优化,也不执行内联),链接器将退出并出现错误,抱怨 _add 被引用但未找到符号。

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

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

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


1
投票

只需将

FOUNDATION_EXPORT
添加到标题 (.h) 上的函数即可。请记住导入 Foundation/Foundation.h (OS X) 或 UIKit/UIKit.h (ios)。

示例:

//.h
#import <UIKit/UIKit.h>

FOUNDATION_EXPORT inline NSString * myInlineFunction(void);
© www.soinside.com 2019 - 2024. All rights reserved.