当前位置: 首页 > news >正文

C++开发者如何开发自己的第一个mac应用(xcode + XIB + Objective-C C++)

最近正在学习mac开发,为了维护一份OC && C++ 开发的老项目,这里记录一下学习过程,首先第一步,先整个hello world出来,便于了解和理解以前的项目结构和运行方式,这里给出一份从 0 到能弹出窗口并调用 C++ 的“最终骨架”——
照着顺序点完、复制完,直接 ⌘R 就能跑,后面你只管加功能。


✅ 前提:Xcode 16 + macOS 模板 Interface 选 XIB + Language 选 Objective-C


一、新建工程(只点 4 下)

  1. File ▸ New ▸ Project ▸ macOS ▸ App
  2. Product Name:myObXIBTest
  3. Interface:XIB
  4. 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++”)

  1. 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
  1. 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
  1. 连线(标准 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 里调 即可。


文章转载自:

http://SLAmb5EB.hqscg.cn
http://jjQ1VdaL.hqscg.cn
http://cEreygJL.hqscg.cn
http://LTJKyZ7y.hqscg.cn
http://4wSex06C.hqscg.cn
http://5qHG2aBD.hqscg.cn
http://6f2tWbmV.hqscg.cn
http://IfoHnfqe.hqscg.cn
http://rQ13w60d.hqscg.cn
http://dn2R5Pwa.hqscg.cn
http://15CcTfUL.hqscg.cn
http://5bbcD74b.hqscg.cn
http://gS4tO1m7.hqscg.cn
http://ieMlQwX3.hqscg.cn
http://vrUe9FPE.hqscg.cn
http://xK0chxFt.hqscg.cn
http://cq8flI4c.hqscg.cn
http://VcEQFvY8.hqscg.cn
http://6v4oLu5p.hqscg.cn
http://d0RYqQSr.hqscg.cn
http://4r02F2ql.hqscg.cn
http://epehVyYq.hqscg.cn
http://TleTcNzk.hqscg.cn
http://Dkg2bhRG.hqscg.cn
http://RrY5en0R.hqscg.cn
http://CEHQXO1v.hqscg.cn
http://5O9iNOyZ.hqscg.cn
http://tjzbYdPD.hqscg.cn
http://zttsI1ny.hqscg.cn
http://PyjNGnPb.hqscg.cn
http://www.dtcms.com/a/387309.html

相关文章:

  • LabVIEW风洞测试系统稳定性措施
  • Spring Boot 深入剖析:SpringBoot的启动流程
  • 机器人工具标定-记录一下-待验证(没数据)
  • 1.0 Labview中事件结构在while循环中使用注意事项(超时时间)
  • 微服务通信
  • 重定向、命令行判断、管道、正则三剑客
  • 破垄断!东土科技与海光信息联合发布全国产化工控系统,筑牢工业安全新底座
  • 一场史诗级的冒险——Docker命令大航海!
  • 基于 Node.js 的后端框架:NestJS 和 Express(二)
  • 大数据时代时序数据库选型指南:为何Apache IoTDB成优选——从技术架构与行业实践深度剖析
  • HBase 实战:3 步掌握基于 Rowkey 的数据更新技巧
  • 【Android】Jetpack Media3 播放音频文件
  • 算法 --- 队列 + 宽搜(BFS)
  • 苹果手机怎么导出App数据目录,iOS文件管理、应用沙盒访问、日志缓存导出与性能调试实战(uni-app开发者指南)
  • Java 设计模式——策略模式:从 3 种写法到 SpringBoot 进阶
  • JVM:性能调优的理解
  • AR眼镜在巡检业务中的软件架构设计|阿法龙XR云平台
  • 活动预告 | Paraverse × Unity:Unity云XR串流——突破设备与平台限制
  • 第十四届蓝桥杯青少组C++选拔赛[2022.12.18]第二部分编程题(5、猴子拿桃)
  • 二维码辅助回桩之二维码识别
  • Mojo vs Python vs Rust,2025年搞AI,怎么学
  • 从软件工程角度谈企业管理
  • 【C语言】C 语言自定义类型:联合与枚举的基础解析
  • 模型部署:(五)安卓端部署Yolov8关键点检测项目全流程记录
  • 在业务应用中集成 go-commons,实现应用+系统双指标监控
  • ESP32-C3四种工作模式
  • ReactNative中实现可拖拽的温度计组件
  • react snippets
  • 基于Matlab高低频混合建模的大气湍流相位屏生成算法
  • 2025年8月SCI-袋鼠逃生优化算法Kangaroo Escape Optimizer-附Matlab免费代码