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

时间:2009-11-18 15:28:51

标签: c++ objective-c iphone gcc

因为我是C ++和gcc相关的所有东西的新手,所以我需要理解一些可能具有关键性的东西。如果我在一个输出为静态lib的新iphone项目中使用.mm文件,我会收到此错误:

“___ gxx_personality_v0”,引自:

如果我将C ++标准库类型从Dynamic(默认值)更改为static,则错误消失。这是SDK的限制吗?是否可以在动态库中启用Obj-C ++扩展?请记住,我是一个新手,我只是假装知道我在这里谈论的是什么。我也想知道这些设置之间的区别,如果更改它们可能会产生负面影响。我的假设是正确的,因为动态库是在运行时加载的,而静态库是在构建时链接到最终的二进制文件中的吗?如果是这样,那么为什么iPhone SDK允许构建动态库?到目前为止,您无法在iPhone上安装第三方库,并在应用程序之间共享它们。

更新 有几个人做出了回应,我很欣赏这些答案。但是,我想澄清一些似乎从我原来的问题中被误解的东西。将文件类型从“.m”切换为“.mm”不是答案,而是触发异常的原因。情况就是这样,为iPhone开发一个静态库,它使用扩展名为“.mm”的Obj-C ++文件。然后在iPhone应用程序(或单元测试套件)中使用此库。除非客户端目标切换为使用“静态”而不是Std C ++库类型的默认“dynamic”,否则您将看到此错误。我原本以为我可能通过更改此设置引入了一个微妙的错误,但我现在正试图了解差异以及为什么默认设置方式与其典型用例相反。

3 个答案:

答案 0 :(得分:2)

使用错误的编译器编译时,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中使用特殊情况代码会很麻烦),Apple开发人员可以并且确实在iPhone上创建动态库。因此Xcode不禁止它;他们只是没有给你一个模板。

答案 1 :(得分:0)

* .m是Obj-C扩展名。
* .M是Obj-C ++扩展。

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

答案 2 :(得分:0)

XCode&gt; ARC启用Test target后,我在___gxx_personality_v0内收到.mm扩展名为.m的文件。当我将文件从.mm重命名为<div class="form-group"> <input type="text" class="form-control" name="pointOne" ng-show="pointOne"> <input type="text" class="form-control" name="pointTwo" ng-show="pointTwo"> <input type="text" class="form-control" name="pointThree" ng-show="pointThree"> <span><button ng-click="addOne()">Add One</button></span> </div> 扩展名时,就解决了这个问题。