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.rhkb.cn/news/310250.html

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

相关文章

华三交换机知道ip怎么查找主机ip在接入交换机哪个端口下

环境&#xff1a; 华三S5120V3-52S-SI H3C Comware Software, Version 7.1.070, Release 6329 问题描述&#xff1a; 华三交换机知道ip怎么查找主机ip在接入交换机哪个端口下 已知主机ip192.168.1.111 解决方案&#xff1a; 在H3C&#xff08;新华三&#xff09;交换机上…

K8S:常用资源对象操作

文章目录 一、使用Replication Controller(RC)、Replica Set(RS) 管理Pod1 Replication Controller&#xff08;RC&#xff09;2 Replication Set&#xff08;RS&#xff09; 二、Deployment的使用1 创建2 滚动升级3 回滚Deployment三、 Pod 自动扩缩容HPA1 使用kubectl autosc…

PCL中VTK场景添加坐标系轴显示

引言 世上本没有坐标系&#xff0c;用的人多了&#xff0c;便定义了坐标系统用来定位。地理坐标系统用于定位地球上的位置&#xff0c;PCL点云库可视化窗口中的坐标系统用于定位其三维世界中的位置。本人刚开始接触学习PCL点云库&#xff0c;计算机图形学基础为零&#xff0c;…

排序链表 - LeetCode 热题 33

大家好&#xff01;我是曾续缘&#x1f639; 今天是《LeetCode 热题 100》系列 发车第 33 天 链表第 12 题 ❤️点赞 &#x1f44d; 收藏 ⭐再看&#xff0c;养成习惯 排序链表 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 示例 1&#xff1a…

机器学习实训 Day1(线性回归练习)

线性回归练习 Day1 手搓线性回归 随机初始数据 import numpy as np x np.array([56, 72, 69, 88, 102, 86, 76, 79, 94, 74]) y np.array([92, 102, 86, 110, 130, 99, 96, 102, 105, 92])from matplotlib import pyplot as plt # 内嵌显示 %matplotlib inlineplt.scatter…

Uniapp+基于百度智能云完成AI视觉功能(附前端思路)

本博客使用uniapp百度智能云图像大模型中的AI视觉API&#xff08;本文以物体检测为例&#xff09;完成了一个简单的图像识别页面&#xff0c;调用百度智能云API可以实现快速训练模型并且部署的效果。 uniapp百度智能云AI视觉页面实现 先上效果图实现过程百度智能云Easy DL训练图…

Redis消息队列-基于PubSub的消息队列

7.3 Redis消息队列-基于PubSub的消息队列 PubSub&#xff08;发布订阅&#xff09;是Redis2.0版本引入的消息传递模型。顾名思义&#xff0c;消费者可以订阅一个或多个channel&#xff0c;生产者向对应channel发送消息后&#xff0c;所有订阅者都能收到相关消息。 SUBSCRIBE …

SpringMVC:搭建第一个web项目并配置视图解析器

&#x1f449;需求&#xff1a;用spring mvc框架搭建web项目&#xff0c;通过配置视图解析器达到jsp页面不得直接访问&#xff0c;实现基本的输出“hello world”功能。&#x1f469;‍&#x1f4bb;&#x1f469;‍&#x1f4bb;&#x1f469;‍&#x1f4bb; 1 创建web项目 1…

Knowledge Editing for Large Language Models: A Survey

目录 IntroductionProblem Formulation评估指标Methods数据集应用讨论挑战未来方向 大型语言模型&#xff08;LLMS&#xff09;最近由于其出色的理解&#xff0c;分析和生成文本的能力而根据其广泛的知识和推理能力来改变了学术和工业景观。然而&#xff0c;LLM的一个主要缺点是…

如何在横向渗透攻击中寻到一线生机

横向渗透&#xff0c;作为计算机网络中的一种攻击技术&#xff0c;展现出了攻击者如何巧妙地利用同一级别系统间的漏洞和弱点&#xff0c;扩大其网络访问权限。与纵向渗透不同&#xff0c;横向渗透不关注权限的垂直提升&#xff0c;而是更侧重于在同一层级内扩展影响力。 横向…

Excel文件解析

在此模块的学习中&#xff0c;我们需要一个新的开源类库---Apahche POI开源类库。这个类库的用途是&#xff1a;解析并生成Excel文件(Word、ppt)。Apahche POI基于DOM方式进行解析&#xff0c;将文件直接加载到内存&#xff0c;所以速度比较快&#xff0c;适合Excel文件数据量不…

Appium知多少

Appium我想大家都不陌生&#xff0c;这是主流的移动自动化工具&#xff0c;但你对它真的了解么&#xff1f;为什么很多同学搭建环境时碰到各种问题也而不知该如何解决。 appium为什么英语词典查不到中文含义&#xff1f; appium是一个合成词&#xff0c;分别取自“applicatio…

JavaEE企业开发新技术5

目录 2.18 综合应用-1 2.19 综合应用-2 2.20 综合应用-3 2.21 综合应用-4 2.22 综合应用-5 Synchronized &#xff1a; 2.18 综合应用-1 反射的高级应用 DAO开发中&#xff0c;实体类对应DAO的实现类中有很多方法的代码具有高度相似性&#xff0c;为了提供代码的复用性,降低…

Mac电脑安装蚁剑

1&#xff1a; github 下载源码和加载器&#xff1a;https://github.com/AntSwordProjectAntSwordProject GitHubAntSwordProject has 12 repositories available. Follow their code on GitHub.https://github.com/AntSwordProject 以该图为主页面&#xff1a;antSword为源码…

Flask快速搭建文件上传服务与接口

说明&#xff1a;仅供学习使用&#xff0c;请勿用于非法用途&#xff0c;若有侵权&#xff0c;请联系博主删除 作者&#xff1a;zhu6201976 一、需求背景 前端通过浏览器&#xff0c;访问后端服务器地址&#xff0c;将目标文件进行上传。 访问地址&#xff1a;http://127.0.0…

内网渗透-内网环境下的横向移动总结

内网环境下的横向移动总结 文章目录 内网环境下的横向移动总结前言横向移动威胁 威胁密码安全 威胁主机安全 威胁信息安全横向移动威胁的特点 利用psexec 利用psexec.exe工具msf中的psexec 利用windows服务 sc命令 1.与靶机建立ipc连接2.拷贝exe到主机系统上3.在靶机上创建一个…

ClickHouse 介绍

前言 一个通用系统意味着更广泛的适用性&#xff0c;但通用的另一种解释是平庸&#xff0c;因为它无法在所有场景内都做到极致。 ClickHouse 在没有像三驾马车这样的指导性论文的背景下&#xff0c;通过针对特定场景的极致优化&#xff0c;获得闪电般的查询性能。 ClickHous…

C++_第五周做题总结_构造与析构

id:31 A.Point&#xff08;类与构造&#xff09; 题目描述 下面是一个平面上的点的类定义&#xff0c;请在类外实现它的所有方法&#xff0c;并生成点测试它。 class Point {double x, y; public:Point(); // 缺省构造函数&#xff0c;给x,y分别赋值为0Point(double x_value…

JAVAEE——网络初始

文章目录 网络发展史独立模式网络模式局域网LAN路由器的诞生 网络通信的基础IP地址端口号 认识协议OSI七层模型TCP/IP五层模型 网络发展史 独立模式 在原始的年代中电脑间想要通信需要两台电脑连接一根网线&#xff0c;但是一台电脑基本上只有一个接口。因此想要链接更多的电…

HCIP课后习题之一

1、路由协议用工作机制上分为那几种&#xff1f;分别是&#xff1f; A&#xff1a;两种。分别是静态路由和动态路由&#xff08;可分为IGP和EGP&#xff09; 2、IGP和EGP协议有哪些&#xff1f; A&#xff1a;IGP: RIP、OSPF、ISIS、EIGRP EGP: BGP 3、路由优先级的用途&…