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

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

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

自从我把它移过来后,Xcode 就拒绝构建它。除非我不包含任何基于 Objective-C 的头文件中的文件。

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

当我注释掉它时还有更多: enter image description here

它的文件扩展名是 .mm,但是我已经用 .cpp 和 .hpp 尝试过,但它们都拒绝构建,除非我不从 Objective-C header 中#include文件。

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

关于为什么会发生这种情况的任何线索?

最佳答案

原则上,您不能从 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,只有结构/类定义属于 header 。

关于c++ - LLVM 拒绝编译 C++ 源代码,奇怪的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8474548/

相关文章:

Angular2/TypeScript - 访问类数组类型的对象元素

c++ - 如何更改 C++ 构建器中 TMenuItem 的可见性?

iphone - AFNetworking AFMultipartFormData如何设置key

php - 使用不同语言的套接字对谜题进行编码

objective-c - 可用于设置计算机 sleep 并在 mac os x 中的 cocoa 应用程序中显示 sleep 值的 API

linux - `gcc: error: 0": No such file or directory` error? 是什么性质

linux - 构建 Linux Kernel 4.18 时出现编译时错误

c++ - TabCtrl_InsertItem : do we need to keep memory of the text alive?

c++ - 避免通用容器中 begin() 和 end() 函数的重复代码

c++ - 将整数打包/解包到 char* 或从 char* 打包/解包时出现问题