在Xcode中,我创建了一个"Cocoa应用程序"项目。它的依赖项之一是包含C++代码的框架。我将 AppDelegate.m 重命名为 AppDelegate.mm 并包含框架。
项目编译失败。问题在于框架中的C++头文件使用了一些与Objective-C或Cocoa冲突的符号。
- C++头文件定义了名为
verify()
和check()
的函数,它们与MacOSX10.8 SDK中的/usr/include/AssertMacros.h冲突。 - C++头文件包含一个名为
NO
的变量,它与Objective-C宏NO
冲突。
解决方法是修改框架中的C++代码以避免这些冲突。但由于这是一个由另一个组织维护的大型C++项目,这将需要时间,并且可能会在C++项目的未来更新中中断。
有没有办法告诉Clang/Xcode将这些C++头文件视为C++而不是Objective-C++?
读Mac OS 10.8附带的/usr/include/AssertMacros.h
,看起来你可以做到:
#define __ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES 0
在包含 AssertMacros.h
之前,这将阻止它定义称为 verify()
和 check()
的宏。
关于NO
:您可以使用预处理器为您重命名该变量。 例如:
#define NO NO_libraryname_renamed
#include <libraryname.hh>
#undef NO
根据库使用 NO
变量的方式,这可能会导致问题 — 如果标头将其声明为 extern
,那么您的 Cocoa 应用程序将以错误的名称引用它,并且您将收到一个未定义的符号错误。 但是,只要您不使用该变量,并且库不依赖于您的应用程序来定义该变量,那么您应该没问题。
(并向有问题的库提交错误报告,要求他们重命名变量。
混合几种语言需要悲伤。更重要的是将目标C++(本身是一种奇怪的混合体)与C++混合在一起。别这样。