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

XCODE和iPhone SDK:C++标准库类型?

  •  2
  • Cliff  · 技术社区  · 15 年前

    因为我是C++和GCC相关的新手,所以我需要了解一些潜在的关键问题。如果在输出为静态库的新iPhone项目中使用.mm文件,则会出现以下错误:

    “uuuuuugxx_u personality_uv0”,引用自:

    如果将C++标准库类型从动态(默认)更改为静态,则错误会消失。这是sdk的限制吗?不能在动态库中启用obj-c++扩展吗?记住我是新手,我只是假装知道我在说什么。我还想知道这些设置之间的区别,以及更改它们是否会产生潜在的负面影响。我的假设是正确的吗?动态库是在运行时加载的,而静态库是在构建时链接到最终的二进制文件的?如果是这样,那么为什么iphone sdk允许构建动态库呢?到目前为止,你不能在iphone上安装第三方libs并在应用程序之间共享它们。

    更新 有几个人回复了,我很感激你的回答。不过,我想澄清的是,我原来的问题似乎有些误解。将文件类型从“.m”切换到“.mm”不是答案,而是引发异常的原因。在这种情况下,为iphone开发一个静态库,使用扩展名为“.mm”的obj-c++文件。然后在iphone应用程序(或单元测试套件)中使用这个库。除非客户端目标切换为使用“静态”而不是 违约 “动态”的STD C++库类型,您会看到这个错误。我原本以为通过改变这个设置可能引入了一个微妙的错误,但现在我试图理解这个差异,以及为什么默认设置的方式似乎与其典型的用例相反。

    3 回复  |  直到 8 年前
        1
  •  2
  •   Rob Napier    15 年前

    martin york认为您使用错误的编译器进行编译是正确的,但是osx的默认文件系统不区分大小写,因此在实践中通常不能使用“.m”来表示obj-c++。您需要用.m命名obj-c文件,用.mm命名obj-c++文件。

    虽然不能在.m文件中使用Obj-c++,但可以肯定地将.m文件链接到C++代码。在同一个项目中,混合Obj-C、Obj-C++和C++是没有问题的。只要正确命名文件,以便使用正确的编译器:

    • M -Obj-C
    • MM -Obj-c++
    • CPP—C++

    您不能在运行时在iphone上加载私有动态库,这是正确的。xcode允许它有两个原因:mac允许动态库(因此在基于sdk的ide中使用特殊的case代码会很痛苦),苹果开发人员可以并且确实在iphone上创建动态库。所以xcode并没有禁止它;他们只是没有给你一个模板。

        2
  •  0
  •   Loki Astari    15 年前

    *.m是obj-c的扩展名。
    *.m是obj-c++扩展。

    重命名文件,以便编译器在链接时使用C++标准库。

        3
  •  0
  •   karim    8 年前

    XCode 与… ARC 启用并进入 Test target ,我得到了这个错误 ___gxx_personality_v0 和那些有 .mm 延伸。当我将文件从.mm重命名为 .m 延期,这解决了问题。