MacOS:使用纯C++创建一个简单的MacAPP的Demo(可以双击运行的那种)

MacOS:使用纯C++创建一个简单的MacAPP的Demo(可以双击运行的那种)

有没有想过Mac上那些app是怎么做出来的?里面都包含了什么东西?今天就来做一个最简单的Mac APP。

背景

Mac的app安装方式就是把xx.app拖拽到/Applications目录下,且/Applications目录下有很多文件夹(对应着一个个的软件)。每个xx.app其实都是一个文件夹,里面有可执行文件、资源、元信息等,只是Mac把这种特殊的文件夹显示为应用图标并且在你双击这种文件夹的时候直接按照元信息运行其中的可执行程序罢了。

超小的.app制作

新建一个空的文件夹如“testMacAPP”,进入这个文件夹,创建一个main.cpp并写入如下内容:

#include <cstdlib>

int main() {
    system("osascript -e 'tell application \"Terminal\" to activate'");
    system("osascript -e 'tell application \"Terminal\" to do script \"echo Hello from C++ App; read\"'");
    return 0;
}

在此文件夹下创建Hello.app/Contents/MacOS子文件夹,编译上述cpp源码并将可执行程序放到Hello.app/Contents/MacOS文件夹下:

clang++ main.cpp -o Hello.app/Contents/MacOS/Hello

接下来在Hello.app/Contents文件夹下创建Info.plist文件并写入以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
    <key>CFBundleExecutable</key>
    <string>Hello</string>

    <key>CFBundleIdentifier</key>
    <string>xyz.letmefly.example.simpleapp.hello</string>

    <key>CFBundleName</key>
    <string>Let's Hello</string>
</dict>
</plist>

然后你的app就做好了。最终结构如下:

testMacAPP
├── Hello.app
│   └── Contents
│       ├── Info.plist
│       └── MacOS
│           └── Hello
└── main.cpp

这个Hello.app文件夹就是一个可以双击运行的Mac app。

现在打开testMacApp文件夹,可以看到Hello.app不是一个普通文件夹的图标,而是一个默认应用的图标。

双击这个应用,会弹出弹窗问是否允许这个应用控制“终端”,点击允许后重新运行下这个应用,可以看到弹出了一个终端,上面有如下类似的字样:

echo Hello from C++ App; read
➜  ~ echo Hello from C++ App; read
Hello from C++ App

等你随便输入一些东西并按下回车后将会变成一个普通的终端。

小app一键生成脚本

也可以运行下面的脚本一键生成:

mkdir -p Hello.app/Contents/MacOS

cat > main.cpp << 'EOF'
#include <cstdlib>

int main() {
    system("osascript -e 'tell application \"Terminal\" to activate'");
    system("osascript -e 'tell application \"Terminal\" to do script \"echo Hello from C++ App; read\"'");
    return 0;
}
EOF

clang++ main.cpp -o Hello.app/Contents/MacOS/Hello
chmod +x Hello.app/Contents/MacOS/Hello

cat > Hello.app/Contents/Info.plist << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
    <key>CFBundleExecutable</key>
    <string>Hello</string>

    <key>CFBundleIdentifier</key>
    <string>xyz.letmefly.example.simpleapp.hello</string>

    <key>CFBundleName</key>
    <string>Let's Hello</string>
</dict>
</plist>
EOF

The End

The End, Thanks!

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tisfy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值