首页 > 其他分享 >modulemap的使用方法

modulemap的使用方法

时间:2023-07-19 19:23:56浏览次数:42  
标签:modulemap 头文件 Swift module framework 导入 模块 使用 方法

modulemap的作用   modulemap 文件是用来解决 C,Object-C,C++ 代码在 Swift 项目中集成的问题的。 在 Swift 项目中,如果需要使用 C,Object-C 或者 C++ 代码,需要将相应的头文件和源文件导入到项目中,并且需要手动管理它们之间的依赖关系。导致项目结构复杂,管理困难。 为了解决这个问题,可以使用 modulemap 文件来定义模块,将 C,Object-C 或者 C++ 代码组合成一个模块,然后在 Swift 项目中直接导入该模块。 文档中的说明:

As Bridging-Header can help us in App Target and App Test Target, not in static library or dynamic libraries to use the Objective C / C APIs into Swift classes, modulemap can help us here.
  在Swift项目中使用Objective C / C APIs的方式 Swift使用Objective C / C源码时:在App工程中OC文件可以通过放置在Bridging-Header文件中让Swift其他文件引用。 Swift使用Objective C / C的静态库,动态库时:在framework静态库,动态库中OC文件可以通过给framework添加module.modulemap让Swift通过“import xxx模块”方式对文件进行引用的。
Module导入方式优点   传统.h文件导入的问题 对于基于C语言而来的其他语言,在导入时,都是导入.h文件,开发者目测很难区分到底导入的是C,C++,还是OC 编译性能问题 编译器在预编译阶段碰到import xx.h后,会将xx文件复制,替换到xx.h这个位置。如果一个.h文件中包含了多个其他.h文件,其他.h文件中又相互包含时,则会出现相同的代码多次被替换。 另外模块多次导入时,还易出现宏定义替换不完全,错误替换的问题(如:当前文件有方法A,它包含的文件中存在了宏定义A,那改如果替换呢) module导入方式 每个模块都是一个完全隔离的个体。 当模块第一次被import时,编译器会根据modulemap把它里面的模块编译成预编译模块(Precompiled Module)pcm文件,并将其在本地缓存,里面包含了模块的所有API信息。 当第二个模块被import导入时,编译器会直接找这个模块被编译后的缓存二进制文件。提升了编译效率。

Module模块的使用方式 普通导入方式:
#import <MyModule/MyModule-Swift.h>
模块导入语法: 
@import MyModule;
Swift导入模块的方式
import MyModule
使用模块导入方式就需要framework下包含module.modulemap文件,modulemap指明了framework中的头文件的逻辑结构和如何映射成模块。 在使用 MyModule 模块时,就可以直接导入MyModule模块文件,而不需要手动逐个添加里面的子模块。
Module模块语法
//给Swift项目用的
framework module MyModule {
  umbrella header "MyModule.h"

  // headers.h 和 module.modulemap  必须在同一group下,否则需要配置 `header "/??/headers.h"`
  header "headers.h"

  requires objc
  export *  //将子模块都导出到主模块
  module * { export * } //将当前目录下所有的头文件(包括umbrella header中包含的每个头文件和其他header "headers.h"头文件)都导出成子模块
}

//给OC项目用的,需要支持objc语言环境
module MyModule.Swift {
  header "MyModule-Swift.h"
  requires objc
}
module * { export * } :将当前目录下所有的头文件打包成一个模块, export * 表示:将其他模块中的所有头文件都导出到当前模块中 export * 和 module * { export * } 同时使用表示将当前目录下所有的头文件打包成一个模块,并将其他模块中的所有头文件也导出到当前模块中。 header 命令:表示将指定的头文件添加到当前模块中。 umbrella header 命令:表示将指定的头文件视为一个 umbrella header,该头文件中包含了其他多个头文件的接口。这个头文件中包含了其他多个头文件的接口,因此可以使用 export * 命令将所有接口都导出到当前模块中。 framework module XXXX 定义了一个 framework 语义的模块 requires objc 说明:导入模块的编译单元要支持OC语言环境 header "headers.h" 说明:将头文件aa.h映射为模块   模块声明
[framework] module module-id [extern_c] [system] {
    module-member
}
extern_c:表示moduel中的C代码可以被C++使用,相当于添加了extern 'C'这个声明。   常见Module目录结构
Name.framework/
    Modules/module.modulemap    framework 的模块映射
    Headers/                    包含了 framework 中的头文件
    PrivateHeaders/             包含了 framework 中私有的头文件
    Frameworks/                 包含嵌入的其它 framework
    Resources/                  包含额外的资源
    Name                        指向共享库的符号链接
  另外 Xcode创建的APP和库默认都是支持Moduel导入的,如果不支持可以手动在在 Build Settings 中,Defines Module 的设置为 YES,进行支持。

参考文章: https://juejin.cn/post/7139724115157450765 https://zhuanlan.zhihu.com/p/602783297 https://www.jianshu.com/p/ce49d8f32f77

标签:modulemap,头文件,Swift,module,framework,导入,模块,使用,方法
From: https://www.cnblogs.com/zhou--fei/p/17566514.html

相关文章

  • iOS使用Run Script提升开发效率
    通过在XcodeRunScript添加shell脚本,然后通过脚本来帮助我们在编译阶段完成一下资源的copy,文件替换,修改等繁琐的事件。使Xcode在编译过程中自动完成耗时繁琐的操作提升开发效率。添加脚本的过程很简单,添加+添加 添加完脚本后可以根据需要调整脚本的执行顺序,如:对应Bundle资......
  • JDBC MYSQL too many connections 解决方法
    显示最大连接数showvariableslike"max_connections";设置最大连接数:setGLOBALmax_connections=1000;查看mysql在关闭一个非交互的连接之前要等待的秒数,默认是28800s也就是一个链接sleep八个小时后才会被mysql“清理”掉。showglobalvariableslike'wait_timeout......
  • 使用 Apache SeaTunnel 实现 Kafka Source 解析复杂Json 案例
    版本说明:SeaTunnel:apache-seatunnel-2.3.2-SNAPHOT引擎说明:Flink:1.16.2Zeta:官方自带前言近些时间,我们正好接手一个数据集成项目,数据上游方是给我们投递到Kafka,我们一开始的技术选型是SpringBoot+Flink对上游数据进行加工处理(下文简称:方案一),由于测试不到位,后来到线上,发现......
  • Synchronized关键字同步类方法
    要想解决“脏数据”的问题,最简单的方法就是使用synchronized关键字来使run方法同步,代码如下:publicsynchronizedvoidrun(){}   从上面的代码可以看出,只要在void和public之间加上synchronized关键字,就可以使run方法同步,也就是说,对于同一个Java类的对象实例,run方法......
  • 使用MASA Stack+.Net 从零开始搭建IoT平台 第四章 4.4 查询历史数据
    @目录前言分析方案编写代码定义数据类编写查询方法添加ECharts图表效果总结前言IoT平台需要监控设备的运行状态,统计和分析设备传感器数据,使用图表展示是比较常见的场景。使用图表和表格数据组合的Dashboard也可以放在首页作为大屏展示。分析因为我们设备上报的数据都是存储......
  • Node-框架NestJS入门使用
     前言介绍Nest是一个用于构建高效,可扩展的Node.js服务器端应用程序的框架。它使用渐进式JavaScript,使用TypeScript构建(保留与纯JavaScript的兼容性),并结合了OOP(面向对象编程),FP(功能编程)和FRP(功能反应编程)的元素。注意请确保你的操作系统上安装了 Node.js(版本>=16)和 npm官......
  • Entity Framework Core 使用案例
    数据库生成实体类代码NuGet:Microsoft.EntityFrameworkCoreMicrosoft.EntityFrameworkCore.Tools在程序包管理控制台中执行一下命令Scaffold-DbContext"Server=【地址】;Database=【数据库名字】;Uid=【用户名】;Pwd=【密码】;"Pomelo.EntityFrameworkCore.MySql-Output......
  • 使用vuex实现任意组件间通信
    title:使用vuex实现任意组件间通信date:2023-07-1915:51:54tags:-vuecategories:-工程-前端top:使用vuex实现任意组件间通信学习vue的第五天,学到了用插件vuex来实现vue任意组件之间的通信。以下是个人理解,如有错误请指正。vuex描述Vuex是一个专为Vue.js应......
  • git的安装与使用
    一、下载Git1、官网地址下载地址2、Git下载太慢,下载传送门https://npm.taobao.org/mirrors/git-for-windows/二、安装1、下载完成后,直接点击安装包安装,即可。2、开始安装,然后下一步3、可以在此处自定义地址,然后下一步3、选择组件此处默认即可,但我选择了一个新功能。4、选择Git默认......
  • 要在HTML中让文字居中,可以使用CSS样式来设置文本的对齐方式
    以下是几种常见的居中文本的方法:使用text-align:center;CSS样式:这个方法适用于将文本居中对齐在其父元素内。可以将text-align:center;应用于父元素,这将使其内部的所有文本内容都居中对齐。示例代码:<style>.container{text-align:center;}</style>......