LLVM拒绝编译C ++源代码,奇怪的错误

时间:2011-12-12 12:49:27

标签: c++ objective-c compiler-errors llvm

我已经为我的应用程序创建了一个缓存文件操作的结构。在将它放入我当前的项目之前,我在一个单独的项目中构建并测试了它。

自从我将其移除后,Xcode拒绝构建它。除非我没有包含任何基于Objective-C的头文件中的文件。

当我尝试包含iostream时出现一个错误: enter image description here

当我发表评论时更多: enter image description here

它的文件扩展名为.mm,但我已经尝试过.cpp和.hpp,但是除非我没有从Objective-C头文件中#include,否则他们都拒绝构建。

我还尝试了iostream中的#import和Objective-C头文件中的文件本身。

有关为何发生这种情况的任何线索?

3 个答案:

答案 0 :(得分:1)

看看herehere。您需要告诉编译器包含libstdc ++。当混合使用Objective-C和C ++时,所有文件都需要具有“.mm”扩展名,如第二个链接所述。

答案 1 :(得分:1)

原则上,您不能包含来自Objective-C源文件的C ++头文件。

毕竟,#include(或#importing)文件只意味着在将结果传递给“实际”编译器之前,预处理器用#included文件的内容替换#include指令。头文件的文件扩展名是常规问题,但它没有实际意义。

您看到的错误消息显然是文件被编译为[Objective-] C而不是[Objective-] C ++的结果。

解决方案:包含C ++头文件的所有源文件必须是C ++(。cpp或.cc或其他一些扩展)或Objective-C ++(。mm)。包含包含C ++头文件的头文件的所有源文件也必须是C ++或Objective-C ++。

编辑:我刚刚看到你要在C ++文件中定义要包含的非内联非模板函数。这是一个无关的问题,但迟早会导致“多重定义”错误。这些函数定义属于.cpp,它不应该在任何地方获得#included,只有struct / class定义属于头文件。

答案 2 :(得分:0)

我怀疑在编译包含相同标头的.m或.c文件时发生错误。