【问题标题】:LLVM refuses to compile C++ source, weird errorsLLVM 拒绝编译 C++ 源代码,奇怪的错误
【发布时间】:2011-12-12 12:49:26
【问题描述】:

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

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

当我尝试包含 iostream 时出现一个错误:

当我将其注释掉时,还有更多:

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

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

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

【问题讨论】:

  • 旁注:由于您使用的是 C++,请摆脱 C-ism typedef struct {...} mytype; 并将其替换为 struct mytype {...};。此外,我看到了许多裸指针。现代资源管理在 C++ 中看起来不同。

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


【解决方案1】:

原则上,您不能在 Objective-C 源文件中包含 C++ 头文件。

毕竟,#include(或#importing)文件仅意味着预处理器将#include 指令替换为#included 文件的内容,然后将结果传递给“实际”编译器。头文件的文件扩展名是约定俗成的,只是没有实际意义。

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

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

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

【讨论】:

  • 感谢您的 cmets,并将所有文件扩展名更改为 Objective-C++ 并使函数内联。现在完美运行。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2019-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多