如何在Objective-C++中编译特定文件,而将项目的其余部分编译为Objective-C?

17

我目前忙于一个项目,需要使用外部附件读取Mifare 1k标签

配件带有一个SDK,用(Objective?)C ++编写,并按提供的说明设置了XCode为“编译源文件:Objective-C++”,并在“其他链接器标志”中添加了“-Obj-C ++”。

然后SDK可以编译通过,但问题是我已经在项目中使用了几个库(例如ASIHTTPRequest,JSONKit等),并且由于这些新设置而导致编译问题。如果切换回以前的设置,则读卡器的SDK会出现编译问题。

问题是:是否有一种方法可以将SDK的类仅作为C ++编译,而将项目的其余部分作为objective-c编译?

编辑: SDK文件仅包含.h文件(和一个链接库)

感谢您的帮助, Mike


你是遇到编译错误还是链接器错误?提供实际的错误信息可以帮助获得更好的答案。 - Nektarios
1
编译错误,主要是转换问题Reachability.m:200: 错误:从'BOOL'无效转换为'NetworkStatus'ASIHTTPRequest/ASIHTTPRequest.m:443:0 ASIHTTPRequest/ASIHTTPRequest.m:443: 错误:从'const void*'无效转换为'const uint8_t*' - Themikebe
4个回答

25

从文件导航中选择要编译为Objective C ++的文件,然后在文件检查器视图中选择文件类型。这是在Xcode 4中进行的操作,但是在Xcode 3中也有类似的机制。

从文件检查器中选择文件类型


谢谢你的回答,如果我在目前发现的解决方案遇到问题,我会尝试这个方法。 - Themikebe
1
谢谢!在我的情况下,无法更改文件扩展名,因为代码是共享的Windows/Mac #ifdef'd代码。在Xcode中为源文件设置-ObjC++标志对我也没有起作用,但这个解决方案确实有效。 - Colin

7

尝试将包含库头文件的文件重命名为myClass.h(接口)和myClass.mm(实现),这将强制将文件编译为objective-c++。


1
谢谢您的回答,但是我只能访问到头文件(和一个链接库)。还有其他办法吗? - Themikebe
1
你所包含的头文件所在类的文件名是否命名为 myClass.h 和 myClass.mm? - Marko Hlebar
我还没有导入任何东西,只是通过更改编译器的标志和“编译源代码为”选项来实现的。 - Themikebe
如果您在任何地方未包含库标头,则尝试将编译器标志改回来,它应该正常编译。然后按照我的说明进行操作。 - Marko Hlebar
谢谢你的帮助,我找到了另一个似乎可以编译的解决方案(目前在问题中分享)。 - Themikebe
嗨,我正在使用相同的Mifare SDK,并且在更改XCode中的编译器设置时,我遇到了AsyncSocket库的相同问题。你是如何解决这个问题的?谢谢。 - Anansi

6
我已经解决了这个问题:
  1. 你应该将 "按文件类型" 设置为 "编译源代码",
  2. 将 "-ObjC++" 设置为 "其他链接器标志"
  3. 最后,你应该修改引用库方法的文件后缀名为 .mm

0

构建阶段选项卡中,有一个名为编译源文件的部分。对于您想要使用Objective-C++编译器的文件,请添加标志:-xobjective-c++

已在Xcode 12.5中测试


我认为被接受的答案比这个解决方案好得多。使用.mm扩展名还可以向任何与文件一起工作的开发人员传达他们正在使用Objective-C++,如果这些文件在另一个目标或项目中使用,它们将自动使用正确的语言。 - pmdj
如果同一个cpp文件在另一个平台上使用,并且通过定义阻止了某些部分的依赖于平台,那么你别无选择。你必须使用这个标志,因为.mm在Linux或Windows上不会被很好地接受。 - Juraj Antas

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