gpt4 book ai didi

objective-c - Objective-C : Inline function - symbol not found

转载 作者:太空狗 更新时间:2023-10-30 03:21:10 25 4
gpt4 key购买 nike

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

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

关于为什么会这样有什么想法吗?

我对编译器非常了解,但对 Objective-C 还是个新手,我所知道的一切都不过是有根据的猜测。即使那样,我也想不出它会那样做的原因。

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

所以,任何人都请来指责我在做什么/想错了什么......

谢谢:-)

最佳答案

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

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

如果你在上面的例子中省略了 static(在调试配置中,没有执行优化,也没有执行内联),链接器将退出并报错,提示 _add 被引用但是 Symbol(s) ) 未找到。

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

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

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

关于objective-c - Objective-C : Inline function - symbol not found,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3514413/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com