我正在尝试在 MacOS 上构建一个用 C++ 编写的跨平台应用程序。在我的 CMake 中我已经包含了
cmake_minimum_required(VERSION 3.28)
project(lel LANGUAGES C CXX)
if(APPLE)
enable_language(OBJC)
endif()
在我的 .cpp 文件中,我还包含了以下内容:
#if defined(SDL_PLATFORM_MACOS)
#include <Cocoa/Cocoa.h>
#include <Foundation/Foundation.h>
#include <QuartzCore/CAMetalLayer.h>
我得到的错误如下:
In file included from /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.5.sdk/System/Library/Frameworks/Cocoa.framework/Headers/Cocoa.h:12:
In file included from /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.5.sdk/System/Library/Frameworks/Foundation.framework/Headers/Foundation.h:9:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.5.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:601:1: error: expected unqualified-id
@class NSString, Protocol;
我知道原因是MacOS使用Objective C来构建程序,而代码库是C++。但我不知道如何解决这个问题。我尝试用
包装我的包含内容#ifdef __OBJC__
#include <Cocoa/Cocoa.h>
#include <Foundation/Foundation.h>
#include <QuartzCore/CAMetalLayer.h>
#endif
但它只会导致错误,指出它无法识别包含中包含的任何“类型”。
如何解决这个问题?预先感谢。
如果要编写 Objective-C 代码或在 C++ 文件中包含 Objective-C 头文件,则需要将
.cc
或 .cpp
扩展名重命名为 .mm
。
在我的 .cpp 文件中,我还包含了以下内容:
#if defined(SDL_PLATFORM_MACOS) #include <Cocoa/Cocoa.h> #include <Foundation/Foundation.h> #include <QuartzCore/CAMetalLayer.h>
您在 C++ 文件中包含 Objective-C 标头。我建议点击 this stackoverflow 答案
中的链接