C++开发者如何开发自己的第一个mac应用(xcode + XIB + Objective-C C++)
最近正在学习mac开发,为了维护一份OC && C++ 开发的老项目,这里记录一下学习过程,首先第一步,先整个hello world出来,便于了解和理解以前的项目结构和运行方式,这里给出一份从 0 到能弹出窗口并调用 C++ 的“最终骨架”——
照着顺序点完、复制完,直接 ⌘R 就能跑,后面你只管加功能。
✅ 前提:Xcode 16 + macOS 模板 Interface 选 XIB + Language 选 Objective-C
一、新建工程(只点 4 下)
- File ▸ New ▸ Project ▸ macOS ▸ App
- Product Name:myObXIBTest
- Interface:XIB
- Language:Objective-C → Create
二、工程里现在有什么(别动,别删)
三、开始干活
✅ 第 1 步:新建窗口控制器(带 XIB)
文件 ▸ 新建 ▸ 文件… ▸ macOS ▸ Cocoa Class
- Class:MyWindowController
- Subclass:NSWindowController
- ✅ 同时创建 XIB 文件 → Next → Create
得到 3 个文件:
MyWindowController.h
MyWindowController.m
MyWindowController.xib
✅ 第 2 步:让 App 启动就加载这个 XIB
AppDelegate.m 里只改 3 行(其余不动):
#import "AppDelegate.h"
#import "MyWindowController.h" // ① 引入头@interface AppDelegate ()
@property (strong) MyWindowController *wc; // ② 持有它
@end@implementation AppDelegate- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {self.wc = [[MyWindowController alloc] initWithWindowNibName:@"MyWindowController"];[self.wc showWindow:nil]; // ③ 弹出窗口
}@end
⌘R 先跑一次 → 能弹出空白窗口 = 成功。
✅ 第 3 步:把 C++ 引擎加进来
文件 ▸ 新建 ▸ 文件… ▸ C++ File
Name:MyEngine
✅ 同时创建头文件 → Create
保存位置:默认就行,记得把文件加入 Targets(打钩)。
内容照抄:
MyEngine.h
#pragma once
#include <string>class MyEngine {
public:std::string echo(const std::string& in);
};
MyEngine.cpp
#include "MyEngine.h"
std::string MyEngine::echo(const std::string& in) {return "[C++] Hello " + in;
}
✅ 第 4 步:OC → C++ 桥梁(1 个 .mm 足够)
文件 ▸ 新建 ▸ 文件… ▸ C++ File
Name:MyEngineBridge
关键:把扩展名 改成 .mm(创建界面就能改)
✅ 同时创建头文件 → Create
MyEngineBridge.h(纯 OC 接口)
#import <Foundation/Foundation.h>@interface MyEngineBridge : NSObject
- (NSString *)echo:(NSString *)text;
@end
MyEngineBridge.mm(内部混写)
#import "MyEngineBridge.h"
#import "MyEngine.h"@implementation MyEngineBridge {MyEngine _engine; // C++ 成员变量
}
- (NSString *)echo:(NSString *)text {std::string cppIn = [text UTF8String];std::string cppOut = _engine.echo(cppIn);return [NSString stringWithUTF8String:cppOut.c_str()];
}
@end
✅ 第 5 步:让窗口能点按钮、能显示结果
1 . 打开 MyWindowController.xib
拖 2 个 NSTextField
+ 1 个 NSButton
(标题改成 “Run C++”)
- MyWindowController.h 加 Outlet/Action:
#import <Cocoa/Cocoa.h>NS_ASSUME_NONNULL_BEGIN@interface MyWindowController : NSWindowController
// 两个输入/输出文本框
@property (weak) IBOutlet NSTextField *inputField;
@property (weak) IBOutlet NSTextField *outputField;// 按钮点击事件
- (IBAction)runCPP:(id)sender;@endNS_ASSUME_NONNULL_END
- MyWindowController.m → 改名为 MyWindowController.mm(回车改后缀)
实现文件:
#import "MyWindowController.h"
#import "MyEngineBridge.h" // 只引 OC 桥@interface MyWindowController ()@end@implementation MyWindowController- (void)windowDidLoad {[super windowDidLoad];// Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
}// ③ 按钮点击事件
- (IBAction)runCPP:(id)sender {NSLog(@">> 按钮被点了"); // ① 看控制台NSString *inStr = self.inputField.stringValue;NSLog(@"输入=%@", inStr); // ② 看输入框拿没拿到NSString *outStr = [[MyEngineBridge alloc] echo:inStr];NSLog(@"输出=%@", outStr); // ③ 看 C++ 返回self.outputField.stringValue = outStr;
}
@end
- 连线(标准 Xcode 操作)
- Assistant 编辑器打开 MyWindowController.h
- 从 文本框 拖到
@property
→ 生成 Outlet - 从 按钮 拖到
- (IBAction)runCPP:
→ 生成 Action
拖完即可,无需手写。
✅ 第 6 步:运行
⌘R
在上边文本框写 World → 点 Run C++ → 下边立刻显示
[C++] Hello World
✅ 最终目录
零额外依赖、零脚本、零配置,这就是 Xcode 16 XIB 项目 + OC 界面 + C++ 逻辑 的最小可运行完整版本。
以后加功能,再新建 .cpp
→ 包 .mm
→ 在 OC 里调 即可。