macOS制作C/C++ app

C/C++制作macOS .app

一、 .app

APP其实是一个文件夹结构,只不过mac的界面中让它看起来像一个单独的文件。
在shell终端或者右键查看包结构即可看到APP的目录结构。

通常的app目录结构如下:

  1. _CodeSignature, CodeResources
    • 一般为Mac APP Store上架程序所包含。里面含有数字签名,以防非法篡改。
  2. Frameworks
    • 一般放置了此程序所使用的第三方FrameWork。
  3. Info.plist
    • 包含了一个程序的基本信息,如最低系统版本要求、版本号,copyright。
    • 也可能包含程序的类型信息,比如这个文件如果有LSUIElement字段并且值为TRUE,则这个程序启动后不会在Dock上显示图标或图标下有表示此程序正在运行的小亮点。
  4. MacOS文件夹
    • 包含了此应用程序真正的可执行文件。一个程序可能包含不只一个可执行文件。
  5. Resources
    • 资源文件,图标,语言包等其他文件,这个没有严格的限制。

参考博客:https://blog.51cto.com/maxma/5708529

二、 实例分析

例如WPS,可以观察到,wps中有一个SharedSupport目录,还包含多个.app:
在这里插入图片描述

QQ也是,不过.app在别的路径:
在这里插入图片描述

ToDesk.app的Info.plist,可以看到里面还包含摄像头、麦克风权限的获取:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict><key>Application is agent(UI Element)</key><false/><key>BuildMachineOSBuild</key><string>22A380</string><key>CFBundleDevelopmentRegion</key><string>en</string><key>CFBundleDisplayName</key><string>ToDesk</string><key>CFBundleExecutable</key><string>ToDesk</string><key>CFBundleIconFile</key><string>ToDesk</string><key>CFBundleIconName</key><string>ToDesk</string><key>CFBundleIdentifier</key><string>com.youqu.todesk.mac</string><key>CFBundleInfoDictionaryVersion</key><string>6.0</string><key>CFBundleName</key><string>ToDesk</string><key>CFBundlePackageType</key><string>APPL</string><key>CFBundleShortVersionString</key><string>4.7.2.1</string><key>CFBundleSupportedPlatforms</key><array><string>MacOSX</string></array><key>CFBundleURLTypes</key><array><dict><key>CFBundleTypeRole</key><string>Editor</string><key>CFBundleURLName</key><string>toc</string><key>CFBundleURLSchemes</key><array><string>todesk</string></array></dict></array><key>CFBundleVersion</key><string>921</string><key>DTCompiler</key><string>com.apple.compilers.llvm.clang.1_0</string><key>DTPlatformBuild</key><string>14B47b</string><key>DTPlatformName</key><string>macosx</string><key>DTPlatformVersion</key><string>13.0</string><key>DTSDKBuild</key><string>22A372</string><key>DTSDKName</key><string>macosx13.0</string><key>DTXcode</key><string>1410</string><key>DTXcodeBuild</key><string>14B47b</string><key>ITSAppUsesNonExemptEncryption</key><false/><key>LSApplicationCategoryType</key><string>public.app-category.utilities</string><key>LSMinimumSystemVersion</key><string>10.11</string><key>NSAppTransportSecurity</key><dict><key>NSAllowsArbitraryLoads</key><true/></dict><key>NSCameraUsageDescription</key><string>是否允许访问摄像头?</string><key>NSMainNibFile</key><string>MainMenu</string><key>NSMainStoryboardFile</key><string>MainMenu</string><key>NSMicrophoneUsageDescription</key><string>是否允许访问麦克风?</string><key>NSPrincipalClass</key><string>NSApplication</string><key>NSRequiresAquaSystemAppearance</key><string>true</string><key>SUAllowsAutomaticUpdates</key><false/><key>SUAutomaticallyUpdate</key><false/><key>SUEnableInstallerLauncherService</key><true/><key>SUEnableSystemProfiling</key><true/><key>SUFeedURL</key><string>http://dl.todesk.com/macos/sparkletestcast.xml</string><key>SUPublicEDKey</key><string>pz7QOaRHU3QI0Nq7IElJPP8WFl52KAFfRNz1D+j1McA=</string>
</dict>
</plist>

三、 用cmake 构建 .app

下载demo示例

以构建具有两个可执行程序的.app为例:

1. 目录结构

其中MacOSXBundleInfo.plist.in是cmake安装目录下自带的Info.plist模板(例如通过homebrew安装的路径是/opt/homebrew/share/cmake/Modules/MacOSXBundleInfo.plist.in

cmake中.in文件一般是模板文件,在执行cmake时,会用CMakeLists.txt中的变量替换模板中的变量。

yq@yqdeMac:~/desktop/ipc$ ls -l
total 72
-rw-r--r--@ 1 yq  staff   986  4  8 19:10 CMakeLists.txt
-rw-r--r--  1 yq  staff  1214  4  8 15:51 MacOSXBundleInfo.plist.in
-rw-r--r--@ 1 yq  staff    27  4  8 17:56 ReaderWindow.cpp
-rw-r--r--@ 1 yq  staff  1061  4  8 20:09 ReaderWindow.hpp
-rw-r--r--@ 1 yq  staff    27  4  8 17:55 WriterWindow.cpp
-rw-r--r--@ 1 yq  staff  1331  4  8 19:08 WriterWindow.hpp
-rw-r--r--@ 1 yq  staff    48  4  8 18:01 config.hpp
-rw-r--r--@ 1 yq  staff   172  4  8 19:10 reader.cpp
-rw-r--r--@ 1 yq  staff   821  4  8 19:50 writer.cpp

2. CMakeLists.txt:

cmake_minimum_required(VERSION 3.20)
project(TestIPC)set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)set(CMAKE_PREFIX_PATH "/Library/Qt/5.15.4_macos_arm64")
find_package(Qt5 REQUIRED COMPONENTS Widgets)##### Write端
##添加writer构建目标,同时作为app的主程序
add_executable(${PROJECT_NAME} MACOSX_BUNDLE writer.cpp WriterWindow.cpp)##填写.app的信息
set(MACOSX_BUNDLE_ICON_FILE MyIcon.icns)
set(MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/MacOSXBundleInfo.plist.in)
set_target_properties(${PROJECT_NAME} PROPERTIESMACOSX_BUNDLE_INFO_PLIST ${MACOSX_BUNDLE_INFO_PLIST}MACOSX_BUNDLE_BUNDLE_NAME ${PROJECT_NAME}MACOSX_BUNDLE_BUNDLE_VERSION "5.20"MACOSX_BUNDLE_SHORT_VERSION_STRING "VersionString"MACOSX_BUNDLE_GUI_IDENTIFIER "com.yangqing.Test"XCODE_ATTRIBUTE_ENABLE_HARDENED_RUNTIME YES
)
target_link_libraries(${PROJECT_NAME} PRIVATE Qt::Widgets)## 链接Qt#### Read端
set(EXE2 reader)
add_executable(${EXE2} reader.cpp ReaderWindow.cpp)## 添加reader构建目标
target_link_libraries(${EXE2} PRIVATE Qt::Widgets)## 链接Qt##修改生成路径
#set_target_properties(${EXE2} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${PROJECT_NAME}.app/Contents/MacOS")

3. 构建

$ mkdir build && cd build
$ cmake ../
$ cmake --build .

生成了TestIPC以及一个可执行文件reader
在这里插入图片描述

若要将reader也加入到TestIPC,可以额外编写脚本。

或者,在CMakeLists.txt一并完成:

set_target_properties(${EXE2} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${PROJECT_NAME}.app/Contents/MacOS")

在这里插入图片描述

四、将app制作成dmg

  1. 在启动器选择“磁盘工具”;
    在这里插入图片描述

  2. 顶部栏选择新建映像–>空白映像
    在这里插入图片描述

3.命名后点存储
在这里插入图片描述

4.右键打开TestIPC,把app拖进去,Applications的软链接也拖进去
在这里插入图片描述

  1. 推出
    在这里插入图片描述

  2. 在磁盘工具顶部选择"映像"–>“转换”
    在这里插入图片描述在这里插入图片描述

即可得到制作后的dmg,还可以更换背景图片等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/803592.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【aws】在DBeaver上用终端节点连接Redshift

碎碎念 最近想要尝试redshift的一个叫做重新定位的功能&#xff0c;重新定位触发之后会停止当前的集群&#xff0c;转而在同一个区域的另一个可用区中启动一个一样的集群&#xff0c;这个过程视情况会花上10到60分钟不等。 但是目前项目中连接到redshift用的是私有ip&#xf…

保研线性代数复习4

一.范数&#xff08;Norms&#xff09; 1.什么是范数&#xff1f; 范数是一个向量空间V的函数&#xff0c;每一个属于向量空间V的向量x都匹配了一个实数&#xff08;它的长度&#xff09;&#xff1a; 2.范数的性质&#xff1f; 齐次性&#xff1a; 正定性&#xff1a; 三…

大创项目推荐 深度学习 机器视觉 车位识别车道线检测 - python opencv

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习 机器视觉 车位识别车道线检测 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满分5分) …

webrtc m98编译问题记录

webrtc m98编译问题 执行命令 gn gen --targetx64 --idevs2019 --args"is_debugtrue rtc_enable_protobuffalse is_clangfalse target_cpu\"x64\" enable_iterator_debuggingtrue use_custom_libcxxfalse symbol_level0 rtc_include_testsfalse" out/d…

【开源书籍】深入讲解内核网络、Kubernetes、ServiceMesh、容器等云原生相关技术。

项目地址&#xff1a;GitHub - isno/theByteBook: ⭐ 【开源书籍】深入讲解内核网络、Kubernetes、ServiceMesh、容器等云原生相关技术。经历实践检验的 DevOps、SRE指南。如发现错误&#xff0c;谢谢提issue 深入架构原理与实践 这是什么&#xff1f; 这是一本关于架构设计…

1. qml的基础入门篇-及学习思路大纲

目录 学习习惯学习大纲&#xff08;会不间断修订&#xff09;&#xff08;留意第一篇&#xff09; 学习习惯 学习qt不得不说的一些基本习惯&#xff1a; ①查看qt源码&#xff0c;学习qt一定要耐心去看qt的源码&#xff0c;有很多技术我们可以从中借鉴 ②查看代码开放平台&…

【Python】基础(专版提升1)

Python基础 1. 导学1.1 学习理念1.1.1 弱语法&#xff0c;重本质1.1.2 是技术&#xff0c;更艺术 1.2 学习方法1.2.1 当天知识必须理解 2. Python 简介2.1 计算机基础结构2.1.1 硬件2.1.2 软件 2.2 基础知识2.2.1 Python介绍2.2.1.1定义2.2.1.2优势2.2.1.3从业岗位 2.2.2 Pytho…

openGauss学习笔记-255 openGauss性能调优-使用Plan Hint进行调优-Hint的错误、冲突及告警

文章目录 openGauss学习笔记-255 openGauss性能调优-使用Plan Hint进行调优-Hint的错误、冲突及告警 openGauss学习笔记-255 openGauss性能调优-使用Plan Hint进行调优-Hint的错误、冲突及告警 Plan Hint的结果会体现在计划的变化上&#xff0c;可以通过explain来查看变化。 …

LeetCode|501. Find Mode in Binary Search Tree

题记 时隔若干年后&#xff0c;我又开始刷leetcode了&#xff0c;看看这次会刷多少。 题目 Given the root of a binary search tree (BST) with duplicates, return all the mode(s) (i.e., the most frequently occurred element) in it. If the tree has more than one …

apex0.1版本安装踩坑指南

踩了无数坑&#xff0c;发现只需要三行命令就可以成功安装apex0.1. 由于pip命令下只能找到0.9的版本&#xff0c;所以需要git clone的方式安装。 1. ​ git clone https://www.github.com/nvidia/apex 这个命令的意思是下载apex到本地。注意&#xff0c;这里需要稳定的环境…

负荷预测 | Matlab基于TCN-GRU-Attention单输入单输出时间序列多步预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab基于TCN-GRU-Attention单输入单输出时间序列多步预测&#xff1b; 2.单变量时间序列数据集&#xff0c;采用前12个时刻预测未来96个时刻的数据&#xff1b; 3.excel数据方便替换&#xff0c;运行环境matlab20…

[法规规划|数据概念]数据要素市场三月速递

“ 代表关注&#xff0c;市场活跃&#xff0c;发展迅速” 01—听听两会代表怎么说 在2024年的全国两会期间&#xff0c;数据要素作为新型的生产要素受到广泛关注&#xff0c;众多代表围绕数据要素市场化、立法、安全监管、人才培养及基础设施建设等方面&#xff0c;积极建言献策…

P8602 [蓝桥杯 2013 省 A] 大臣的旅费【树的直径】

P8602 [蓝桥杯 2013 省 A] 大臣的旅费 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include<iostream> #include <algorithm> #include <vector> using namespace std; #define int long long const int N5e5100; int n; int res0; typedef pair<int,…

植物大战僵尸Python版,附带源码注解

目录 一、实现功能 二、安装环境要求 三、如何开始游戏 四、怎么玩 五、演示 六、部分源码注释 6.1main.py 6.2map.py 6.3Menubar.py 七、自定义 7.1plant.json 7.2zombie.json 一、实现功能 实施植物&#xff1a;向日葵、豌豆射手、壁桃、雪豆射手、樱桃炸弹、三…

蓝桥杯——最长递增

题目 在数列 a1, a2,,an 中&#xff0c;如果 a¡ < ai1 < ai2 <<aj&#xff0c;则称 ai 至 a,为一段递增序列&#xff0c;长度为 j-i 1。 定一个数列&#xff0c;请问数列中最长的递增序列有多长。 输入描述 输入的第一行包含一个整数 n。 第二行包含 几 个整…

【前端】学习路线

1、基础 1.1 HTML 菜鸟教程-主页&#xff1a;https://www.runoob.com/ 可以学习&#xff1a;HTML、CSS、Bootstrap等 1.2 CSS 《通用 CSS 笔记、建议与指导》 1.3 JavaScript 1&#xff09;入门&#xff1a;JavaScript 的基本语法 2&#xff09;进阶&#xff1a;现代 …

蓝桥杯中的DFS算法

前言 和上一篇文章一样&#xff0c;这篇文章是介绍蓝桥杯中的第二种暴力算法就是DFS算法&#xff0c;在蓝桥杯中非常常用。 简单介绍 DFS算法中文名就是深度优先算法&#xff0c;在这里就不详细介绍这个算法了&#xff0c;可以自行搜索&#xff0c;网上有很多&#xff0c;或…

前端小白的学习之路(Vue2 二)

提示&#xff1a;学习vue2的第二天&#xff0c;笔记记录&#xff1a;自定义指令&#xff0c;事件修饰符&#xff0c;属性计算&#xff0c;属性监听&#xff0c;属性过滤 目录 一、自定义指令 1.全局注册 2.局部注册 二、事件修饰符 1.常用事件修饰符 1&#xff09;事件相…

Http客户端Feign

RestTemplate存在的问题 这是一段使用RestTemplate来发起远程调用的代码&#xff0c;存在以下问题 1&#xff0c;代码可读性差&#xff0c;编程体验不统一&#xff08;其实还好&#xff09; 2&#xff0c;复杂的url难以维护&#xff0c;修改起来十分麻烦 3&#xff0c;总结…

4.9作业

完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示“登录成功“&#xff0c;提供一个Ok 按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密码不匹配&#xf…