Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XCode和iphonesdk:C++;标准库类型? 因为我是C++和GCC相关的新手,我需要了解一些潜在的关键问题。如果我在一个新的iphone项目中使用.mm文件,而该项目的输出是静态库,则会出现以下错误:_C++_Objective C_Iphone_Gcc - Fatal编程技术网

XCode和iphonesdk:C++;标准库类型? 因为我是C++和GCC相关的新手,我需要了解一些潜在的关键问题。如果我在一个新的iphone项目中使用.mm文件,而该项目的输出是静态库,则会出现以下错误:

XCode和iphonesdk:C++;标准库类型? 因为我是C++和GCC相关的新手,我需要了解一些潜在的关键问题。如果我在一个新的iphone项目中使用.mm文件,而该项目的输出是静态库,则会出现以下错误:,c++,objective-c,iphone,gcc,C++,Objective C,Iphone,Gcc,“\uuuuuuugxx\u个性\u v0”,引用自: 如果将C++标准库类型从动态(默认)更改为静态,则错误会消失。这是SDK的一个限制吗?不能在动态库中启用Obj-C++扩展吗?请记住,我是个新手,我只是假装知道我在说什么。我还想知道这些设置之间的区别,以及更改它们是否有潜在的负面影响。我的假设正确吗?动态库在运行时加载,而静态库在构建时链接到最终二进制文件?如果是这样,那么为什么iphonesdk允许构建动态库呢?迄今为止,您无法在iPhone上安装第三方LIB并在应用程序之间共享它们 更

“\uuuuuuugxx\u个性\u v0”,引用自:

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

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

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


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

Martin York编译错误的编译器是正确的,但是OSX的默认文件系统不是区分大小写的,因此在实践中通常不能使用“.m”表示Obj-C++。您需要将Obj-C文件命名为.m,将Obj-C++文件命名为.mm

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

  • m-Obj-C
  • mm-Obj-C++
  • cpp-C++

正确的说法是,您不能在iPhone上运行时加载私有动态库。Xcode允许它有两个原因:Mac确实允许动态库(因此在基于SDK的IDE中使用特例代码是一件痛苦的事情),苹果开发者可以并且确实在iPhone上创建动态库。所以Xcode并不禁止它;他们只是没有给你一个模板。

XCode
>中使用
ARC
启用,在
测试目标
中,我用扩展名为
.mm
的文件得到了这个错误。当我将文件的扩展名从.mm重命名为
.m
时,问题就解决了

我确实重命名了我的文件,这就是导致错误的原因。我用“.m”表示Obj-C++,虽然我听说你也可以用“.m”。我的问题是,我不知道什么,如果有的话,将受到使用“静态”的STD C++库类型的影响。我也不明白为什么默认设置为dynamic,它设置为dynamic,以便使用操作系统中发布的最新版本。如果你静态链接,那么你的应用程序将始终使用相同的版本,这将过时。此外,它允许多个应用程序共享同一代码,这使得操作系统更加有效。不应该使用.m文件来使用目标C++ C++链接来对抗C++代码。正如你所发现的那样,会导致链接器问题。你不能使用.OM文件来使用Obj-C++,但是你可以使用.m文件来链接C++代码。在链接时在项目中混合语言是没有问题的。文件扩展名不是我这里要问的。我完全知道您需要为Obj-C++使用正确的扩展。我的问题是iPhone项目中“动态”和“静态”库类型的切换和默认设置。我知道Mac甚至iPhone中都有动态库的位置。我的问题是,为什么在iPhone项目模板中默认设置为“动态”?这意味着这就是为iPhone开发库的方式。如果是这样的话,那么在iphonelibs中使用static会有什么影响呢?我从来没有见过它默认设置为dynamic。创建目标或项目时是否使用了静态库模板?它应该将其设置为静态。您不应该为iPhone创建动态库;但是,您应该链接到系统动态库。静态库意味着它将直接链接到最终的二进制文件中。最终只有一个二进制文件;否。a将被复制到手机。将文件从
.mm
重命名为
.m
将产生后果,但是,否则,为什么他们首先要使用该扩展名?他们混合使用了c/cpp和objc代码。是的,您必须删除任何c/cpp代码组合。对于.m,您应该只有objc代码。