gpt4 book ai didi

header - Objective-C++ 符号未发现奇怪的现象

转载 作者:行者123 更新时间:2023-12-02 01:02:46 24 4
gpt4 key购买 nike

hej.h

void hej();

hej.m

void hej(){}

主.mm

#import "hej.h"

int main(int argc, char *argv[])
{

}

这给了我:

“hej()”,引用自:main.o 中的 _main未找到符号

如果我将 main.mm 重命名为 main.m (单个 m),或者将 hej.m 重命名为 mm 或 cpp,那么它就可以工作。 (尽管这些“解决方案”都不是更好的选择。想象一下,您想在 objc++ 环境中使用 c-lib - 您不想更改整个库,甚至可能不能,并且您需要在 objc++ 中使用它。 )

这里到底发生了什么?

最佳答案

在 C 文件 (*.c, *.m) 中编译时,声明 void hej() 生成对名为 C 函数的链接器引用>_hej。当在 C++ 文件(*.cc、*.mm、 等)中编译时,声明会生成对 C++“损坏名称”的链接器引用,其中包含参数的描述。 (这样做是为了支持函数重载,例如区分 void hej(int)void hej(char*))。 hej.m 始终创建 C 名称。当main.mm引用C++名称时,将找不到它。

要解决此问题,请确保 main.mm 查找 C 名称,而不是 C++ 名称。如果您控制 hej.h,通常会添加如下内容,当 hej.h 包含在 C 或 C++ 文件中时,这将起作用:

/* hej.h */
#ifdef __cplusplus
extern "C" {
#endif

void hej();

#ifdef __cplusplus
}
#endif

如果您不拥有 hej.h,您可以在 main.mm 中执行以下操作:

extern "C" {
#import "hej.h"
}

int main(int argc, char *argv[])
{
}

关于header - Objective-C++ 符号未发现奇怪的现象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1362695/

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