Swift-log包在Ubuntu 23.10编译失败,求排查解决思路
Swift Logging模块在Ubuntu 23.10编译报错:strftime参数可选类型未解包
问题场景
- 运行环境:Ubuntu 23.10(GNU/Linux 6.5.0-1006-raspi aarch64),Swift 5.9.1(swift-5.9.1-RELEASE)
- 编译错误信息:
/(my package)/.build/checkouts/swift-log/Sources/Logging/Logging.swift:1392:64: error: value of optional type 'UnsafeMutablePointer<tm>?' must be unwrapped to a value of type 'UnsafeMutablePointer<tm>'
strftime(&buffer, buffer.count, "%Y-%m-%dT%H:%M:%S%z", localTime)
- 对比验证:该问题在macOS上不存在,且同一包在Ubuntu 22.04.3 LTS可成功编译。
问题原因
确实是strftime的签名差异导致的。Ubuntu 23.10搭载的glibc 2.38版本对strftime的接口做了调整,将接收的tm指针类型从非可选改为可选;而Ubuntu 22.04使用的glibc 2.35仍保持旧的非可选指针签名。Swift的系统模块绑定会根据系统glibc版本生成对应的接口,这就造成了跨Ubuntu版本的编译不兼容。
解决方案
- 升级Swift Logging模块到兼容版本:Swift Logging社区已修复该跨平台适配问题,将依赖版本更新至>=1.5.3即可解决。修改
Package.swift中的依赖配置:
.package(url: "https://github.com/apple/swift-log.git", from: "1.5.3"),
执行swift package update拉取最新代码后重新编译。
- 临时应急修改(不推荐):若暂时无法升级模块,可手动修改报错的
Logging.swift代码,对localTime进行强制解包(需确保指针非空):
strftime(&buffer, buffer.count, "%Y-%m-%dT%H:%M:%S%z", localTime!)
注意:该方式会跳过安全检查,且后续模块更新会覆盖修改,仅适合临时场景。
- 降级系统到Ubuntu 22.04 LTS:如果项目依赖复杂无法升级模块,可切换至Ubuntu 22.04 LTS,保持glibc版本兼容性,避免编译错误。
内容的提问来源于stack exchange,提问作者Fleet Phil
相关产品推荐
相关产品推荐

