如何解决在Objective-C++中出现而在Objective-C中未出现的链接错误?

4
我正在将我的App Delegate文件从.m转换为.mm(从Objective-C到Objective-C ++),以便我可以访问用Objective-C++编写的第三方库。在Objective-C中,我的应用程序委托构建并运行良好。但是当我更改扩展名时,项目会构建,但我会收到链接错误,所有这些错误都是来自我使用的C语言静态库中缺少符号。错误是经典的链接错误,具有以下格式:
“MyFunction(arguments)”,引用自:
-[MyAppDelegate myMethod] in MyAppDelegate.o
找不到符号
所有问题都在应用程序委托对象中。我知道我已准备好编译Objective-C ++,因为我的ViewController文件是.mm。因此,我的问题有几个部分。
首先,这些符号是否真的不存在,以至于我无法使用它们?换句话说,不可能从Objective-C++文件访问普通的C函数吗?如果是这样,那就太不幸了。我认为几乎所有Objective-C代码,特别是所有至少作为.mm构建的Objective-C代码,都是有效的Objective-C ++。我错了吗?
如果不是,请问如何避免这些错误?Objective-C++中是否有不同的头文件规则,我不知道?
感谢您的所有帮助。
2个回答

8
使用C++和C或C++和Objective-C混合编程时,链接错误通常是由于C++名字修饰引起的。请确保您已将extern "C"附加到所有适当的声明上,并且还要确保您的所有代码都同意链接。也就是说,确保函数定义以及使用它的地方都可以看到extern "C"extern "C++"
在您的特定情况中,似乎MyFunction()正在使用C++链接进行编译并具有其名称修饰,但您的myMethod Objective-C文件尝试链接到未修饰的名称。
这里是维基百科关于名称修饰的文章链接。

3

在头文件 include 周围加上 extern C

这会告诉链接器库中的函数名不需要进行 C++ 名称改编。

例如:

 extern "C" {
   #include "my-lib.h"
 }

将此内容包含在头文件中,而不是在#include周围。 - tc.
tc,他为什么要污染头文件,而他并不需要这样做呢? - tpdi
为了使它可以在任何C++源文件中使用而不污染源文件,他需要将extern "C"{}#ifdef __cplusplus括起来,以便仍然可以在C中编译。 - JeremyP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接