4.2.2 调试模块映射
2 分钟阅读
原文链接: https://docs.swift.org/latest/documentation/packagemanagerdocs/debuggingmodulemaps/
4.2.2 调试模块映射
在 Swift 无法导入你的 C 或 C++ 库时诊断并解决问题。
概述
当你为 C 库创建模块映射时,编译错误或导入失败都说明配置有问题。本文介绍如何测试模块映射并修复常见问题。
在下列情况下可以使用这些技巧:
- Swift 找不到你的模块
- 头文件导入失败
- C++ 代码产生编译错误
- 你需要验证 Swift Package Manager 是否正确配置了你的模块
测试你的模块映射
在发布之前,先验证 Swift 能够导入你的模块。
创建一个简单的导入测试
创建一个导入你模块的测试 Swift 文件:
| |
构建这个测试文件:
| |
如果模块映射有错误,编译器会给出诊断信息,指出问题所在。
验证构建配置
使用详细输出验证 Swift Package Manager 是否正确配置了你的模块:
| |
在输出中查找这些编译器标志:
- 指向你的头文件目录的
-I标志 - 指向你的模块映射的
-fmodule-map-file=标志 - 针对二进制库的链接标志
解决常见问题
当 Swift 找不到你的模块或头文件时,请检查下面这些常见原因。
修复模块名不匹配
验证模块映射中的模块名与产物名或目标名是否一致。
如果 Swift 找不到你的模块,请确认:
- 模块映射中的模块名与产物名或目标名完全一致。
- 模块映射文件名为
module.modulemap。 - info.json 中的
moduleMapPath指向正确的文件。 - 对于系统库,目标目录中包含该模块映射。
定位缺失的头文件
当编译器报告头文件缺失时,请检查头文件路径和文件位置。
如果编译器报告某个头文件缺失:
- 检查模块映射中的头文件路径是否相对于该模块映射文件。
- 确认头文件确实存在于指定的位置。
- 确保 info.json 中的
headerPaths数组包含该目录。
修复 C++ 编译错误 {#Fix-C++-compilation-errors}
添加 C++ 语言支持指令以解决 C++ 语法错误。
如果你遇到关于 C++ 语法的错误:
- 在模块映射中添加
requires cplusplus。 - 对于 C++11 或更高版本的特性,使用
requires cplusplus11。 - 确认你的头文件在 C/C++ 混用时使用了恰当的
#ifdef __cplusplus保护。