2

在 Xcode 中,我创建了一个“Cocoa 应用程序”项目。它的依赖项之一是包含 C++ 代码的框架。我将 AppDelegate.m 重命名为 AppDelegate.mm 并包含了框架。

该项目无法编译。问题是框​​架中的 C++ 头文件使用了一些与 Objective-C 或 Cocoa 冲突的符号。

  • C++ 头文件定义了名为verify()and的函数check(),这与 MacOSX10.8 SDK 中的 /usr/include/AssertMacros.h 冲突。
  • C++ 头文件包含一个名为 的变量NO,它与 Objective-C 宏冲突NO

一种解决方法是修改框架中的 C++ 代码以避免这些冲突。但由于它是由另一个组织维护的大型 C++ 项目,这将需要时间,并且可能会在 C++ 项目的未来更新中中断。

有没有办法告诉 Clang/Xcode 将这些 C++ 头文件视为 C++ 而不是 Objective-C++?

4

2 回答 2

2

通读/usr/include/AssertMacros.hMac OS 10.8 附带的,看起来你可以这样做:

#define __ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES 0

在 include 之前AssertMacros.h,这将阻止它定义名为verify()and的宏check()

关于NO:您可以使用预处理器为您重命名该变量。例如:

#define NO NO_libraryname_renamed
#include <libraryname.hh>
#undef NO

根据NO库使用变量的方式,这可能会导致问题 - 如果标头将其声明为extern,那么您的 Cocoa 应用程序将通过错误的名称引用它,并且您将收到未定义符号错误。但只要您不使用该变量,并且该库不依赖于您的应用程序来定义该变量,那么您应该没问题。

(并且请向有问题的库提交错误报告,要求他们重命名变量。)

于 2013-01-25T18:51:32.163 回答
-4

混合几种语言需要悲伤的。将Objective C++(本身就是一个奇怪的混合体)与C++混合更是如此。不要这样做。

于 2013-01-25T18:11:14.287 回答