You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 19:40:19