代码之家  ›  专栏  ›  技术社区  ›  Luke

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

  •  4
  • Luke  · 技术社区  · 14 年前

    我正在将我的应用程序委托文件从.m转换为.m m(objective-c到objective-c++),这样我就可以访问用objective-c++编写的第三方库。在Objective-C中,我的应用程序代表构建并运行良好。但是当我更改扩展名时,项目会生成并得到链接错误,所有这些都是我使用的C语言编写的静态库中缺少的符号。这些错误是具有以下格式的经典链接错误:

    “MyFunction(arguments)”,引用自:

    -MyAppDelegate.o中的[MyAppDelegate MyMethod]

    找不到符号

    所有问题都在app delegate对象中。我知道我已经准备好编译Objective-C++了,因为我的viewController文件是.m m。所以我的问题有几个部分。

    首先,这些符号真的不是我不能用的意义上的符号吗?换句话说,是否不可能从Objective-C++文件访问普通的旧C函数?如果这是真的,那就太不幸了。我认为几乎所有的objective-c代码,当然所有至少构建为.mm的objective-c代码,都是有效的objective-c++。我错了吗?

    如果没有,我知道如何防止这些错误吗?在我不知道的Objective-C++中,是否有不同的头规则?

    谢谢你的帮助。

    2 回复  |  直到 14 年前
        1
  •  8
  •   Carl Norum    14 年前

    混合C++/C或C++/ObjuleC程序的链接错误通常是由于C++名称的限制。确保你有 extern "C" 附加到所有适当的声明,并且您的所有代码都同意链接。也就是说,确保函数定义以及使用它的位置都可以看到 外部“C” extern "C++" .

    在你的特殊情况下,看起来 MyFunction() 是用C++链接编译的,它的名字被修改了,但是你的名字 myMethod Objective-C文件正试图链接到未组合的名称。

    这是维基百科关于 name mangling .

        2
  •  3
  •   tpdi    14 年前

    围绕你的头部包括 extern C .

    这将告诉链接器库中的函数名 获取C++名称的修改。

    例如。:

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