5

hej.h

void hej();

hej.m

void hej(){}

主要.mm

#import "hej.h"

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

}

这给了我:

“hej()”,引用自:_main in main.o symbol(s) not found

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

这里到底发生了什么?

4

1 回答 1

17

在 C 文件 ( *.c, *.m) 中编译时,该声明会void hej()生成一个指向名为 的 C 函数的链接器引用_hej。当在 C++ 文件(*.cc, *.mm,等)中编译时,该声明会生成一个对 C++ 'mangled name' 的链接器引用,其中包括对参数的描述。(这样做是为了支持函数重载,例如区别于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[])
{
}
于 2009-09-01T14:41:33.587 回答