|
| 1 | +--- |
| 2 | +title: MacOS:使用纯C++创建一个简单的MacAPP的Demo(可以双击运行的那种) |
| 3 | +date: 2026-06-20 15:25:21 |
| 4 | +tags: [VsCode, 简单, Mac, MacOS] |
| 5 | +categories: [技术思考] |
| 6 | +--- |
| 7 | + |
| 8 | +# MacOS:使用纯C++创建一个简单的MacAPP的Demo(可以双击运行的那种) |
| 9 | + |
| 10 | +有没有想过Mac上那些app是怎么做出来的?里面都包含了什么东西?今天就来做一个最简单的Mac APP。 |
| 11 | + |
| 12 | +## 背景 |
| 13 | + |
| 14 | +Mac的app安装方式就是把xx.app拖拽到/Applications目录下,且/Applications目录下有很多文件夹(对应着一个个的软件)。每个xx.app其实都是一个文件夹,里面有可执行文件、资源、元信息等,只是Mac把这种特殊的文件夹显示为应用图标并且在你双击这种文件夹的时候直接按照元信息运行其中的可执行程序罢了。 |
| 15 | + |
| 16 | +## 超小的.app制作 |
| 17 | + |
| 18 | +新建一个空的文件夹如“testMacAPP”,进入这个文件夹,创建一个main.cpp并写入如下内容: |
| 19 | + |
| 20 | +```cpp |
| 21 | +#include <cstdlib> |
| 22 | + |
| 23 | +int main() { |
| 24 | + system("osascript -e 'tell application \"Terminal\" to activate'"); |
| 25 | + system("osascript -e 'tell application \"Terminal\" to do script \"echo Hello from C++ App; read\"'"); |
| 26 | + return 0; |
| 27 | +} |
| 28 | +``` |
| 29 | + |
| 30 | +在此文件夹下创建`Hello.app/Contents/MacOS`子文件夹,编译上述cpp源码并将可执行程序放到`Hello.app/Contents/MacOS`文件夹下: |
| 31 | + |
| 32 | +```bash |
| 33 | +clang++ main.cpp -o Hello.app/Contents/MacOS/Hello |
| 34 | +``` |
| 35 | + |
| 36 | +接下来在`Hello.app/Contents`文件夹下创建`Info.plist`文件并写入以下内容: |
| 37 | + |
| 38 | +```xml |
| 39 | +<?xml version="1.0" encoding="UTF-8"?> |
| 40 | +<plist version="1.0"> |
| 41 | +<dict> |
| 42 | + <key>CFBundleExecutable</key> |
| 43 | + <string>Hello</string> |
| 44 | + |
| 45 | + <key>CFBundleIdentifier</key> |
| 46 | + <string>xyz.letmefly.example.simpleapp.hello</string> |
| 47 | + |
| 48 | + <key>CFBundleName</key> |
| 49 | + <string>Let's Hello</string> |
| 50 | +</dict> |
| 51 | +</plist> |
| 52 | +``` |
| 53 | + |
| 54 | +然后你的app就做好了。最终结构如下: |
| 55 | + |
| 56 | +``` |
| 57 | +testMacAPP |
| 58 | +├── Hello.app |
| 59 | +│ └── Contents |
| 60 | +│ ├── Info.plist |
| 61 | +│ └── MacOS |
| 62 | +│ └── Hello |
| 63 | +└── main.cpp |
| 64 | +``` |
| 65 | + |
| 66 | +这个Hello.app文件夹就是一个可以双击运行的Mac app。 |
| 67 | + |
| 68 | +现在打开`testMacApp`文件夹,可以看到`Hello.app`不是一个普通文件夹的图标,而是一个默认应用的图标。 |
| 69 | + |
| 70 | +双击这个应用,会弹出弹窗问是否允许这个应用控制“终端”,点击允许后重新运行下这个应用,可以看到弹出了一个终端,上面有如下类似的字样: |
| 71 | + |
| 72 | +```bash |
| 73 | +echo Hello from C++ App; read |
| 74 | +➜ ~ echo Hello from C++ App; read |
| 75 | +Hello from C++ App |
| 76 | +``` |
| 77 | + |
| 78 | +等你随便输入一些东西并按下回车后将会变成一个普通的终端。 |
| 79 | + |
| 80 | +## 小app一键生成脚本 |
| 81 | + |
| 82 | +也可以运行下面的脚本一键生成: |
| 83 | + |
| 84 | +```bash |
| 85 | +mkdir -p Hello.app/Contents/MacOS |
| 86 | + |
| 87 | +cat > main.cpp << 'EOF' |
| 88 | +#include <cstdlib> |
| 89 | +
|
| 90 | +int main() { |
| 91 | + system("osascript -e 'tell application \"Terminal\" to activate'"); |
| 92 | + system("osascript -e 'tell application \"Terminal\" to do script \"echo Hello from C++ App; read\"'"); |
| 93 | + return 0; |
| 94 | +} |
| 95 | +EOF |
| 96 | + |
| 97 | +clang++ main.cpp -o Hello.app/Contents/MacOS/Hello |
| 98 | +chmod +x Hello.app/Contents/MacOS/Hello |
| 99 | + |
| 100 | +cat > Hello.app/Contents/Info.plist << 'EOF' |
| 101 | +<?xml version="1.0" encoding="UTF-8"?> |
| 102 | +<plist version="1.0"> |
| 103 | +<dict> |
| 104 | + <key>CFBundleExecutable</key> |
| 105 | + <string>Hello</string> |
| 106 | +
|
| 107 | + <key>CFBundleIdentifier</key> |
| 108 | + <string>xyz.letmefly.example.simpleapp.hello</string> |
| 109 | +
|
| 110 | + <key>CFBundleName</key> |
| 111 | + <string>Let's Hello</string> |
| 112 | +</dict> |
| 113 | +</plist> |
| 114 | +EOF |
| 115 | +``` |
| 116 | + |
| 117 | +# The End |
| 118 | + |
| 119 | +<center><font size="6px" face="Ink Free">The End, Thanks!</font></center> |
| 120 | + |
| 121 | +> 同步发文于[CSDN](https://letmefly.blog.csdn.net/article/details/162148634)和我的[个人博客](https://blog.letmefly.xyz/),原创不易,转载经作者同意后请附上[原文链接](https://blog.letmefly.xyz/2026/06/20/Other-MacOS-SimpleAppDemo/)哦~ |
| 122 | +> |
| 123 | +> 千篇源码题解[已开源](https://github.com/LetMeFly666/LeetCode) |
0 commit comments