Skip to content

[bug] macOS 大小写不敏感:依赖源码根(-I)里的 VERSION 文件顶替 libc++ <version>,炸掉全部 C++ module 消费者(compat.ffmpeg / import ffmpeg.av) #249

Description

@Sunrisepeak

现象

macOS 上,任何 C++ 消费者(尤其 C++23 module)include 一个把源码根目录放进 include_dirs 的依赖(compat.ffmpeg:include_dirs* = 解压后的 ffmpeg-8.1.2/ 根)时,libc++ 内部的 #include <version>依赖根目录里的 VERSION 文件顶替,当成 C++ 解析炸掉:

In file included from …/libavutil/common.h:36:                 // #include <math.h>
In file included from …/llvm/20.1.7/include/c++/v1/math.h:369:
In file included from …/llvm/20.1.7/include/c++/v1/__math/hypot.h:21:
In file included from …/llvm/20.1.7/include/c++/v1/limits:119:    // libc++ <limits> → #include <version>
…/compat.ffmpeg/8.1.2/ffmpeg-8.1.2/version:1:1: error: expected unqualified-id

ffmpeg-8.1.2/VERSION 是 ffmpeg.org release tarball 的顶层版本串文件(内容 8.1.2\n,git 仓库没有、只有 release dist 有)。

根因

  • mcpp 把 [build].include_dirs 一律发成 -I(angle 搜索链的最前组,先于工具链 C++ 头)。确认:xpkg.cppm 保留键只有 include_dirs;无 -isystem/-iquote/-idirafter 面向描述符的变体。
  • macOS 文件系统大小写不敏感:#include <version>(libc++ <limits> 拉的 C++ 特性测试头)在 -I …/ffmpeg-8.1.2/ 里匹配到 VERSION,先于 libc++ 自带 <version>
  • C 消费者不触发(C 的 <math.h> 不拉 libc++ <version>)——所以 compat.ffmpeg 的在 macOS 全绿(C 成员 test 通过),只有 C++ module(import ffmpeg.av)炸。linux 大小写敏感,<version>VERSION,无此问题。

这是通用隐患:任何依赖源码根有 VERSION/RELEASE/list/array… 等与 C++ 标准头同名(大小写不敏感)的无扩展名文件,放进 -I 后都会在 macOS 顶替标准库头,炸掉全部 C++ 消费者。

影响

挡死 macOS 上 compat.ffmpeg 的 C++ module 消费者(ffmpeg-m import ffmpeg.av)。库层已 ok(mcpp-index PR#89 macos 绿);差 module 这一层。opencv 同理有风险(其源码树也可能有同名文件)。

建议修复

给描述符一个"低优先级 include"变体,发成 -idirafter(排在工具链系统头之后):这样 <version> 命中 libc++ 自带的(正确),而 <libavutil/frame.h>(非系统头)仍能在 idirafter 的 ffmpeg 根里找到。例如:

[build]
include_dirs       = ["mcpp_generated", "mcpp_generated/libavcodec"]  # -I(高优先级,自有生成头)
include_dirs_after = ["*", "*/libavcodec"]                            # -idirafter(源码根,让系统 C++ 头优先)

(gcc/clang 都支持 -idirafter;linkmodel.cppm 里 mcpp 已在 payload 头场景用过 -idirafter/-isystem,此处是把该能力开放给依赖描述符。)也可考虑 macOS 上把依赖的源码根 include 默认降到系统头之后,但显式 include_dirs_after 更可控、跨平台一致。

复现

mcpp-index PR#91(spike/…ffmpeg-0.0.2-macos)workspace(macos) 腿:mcpp test -p ffmpeg-module,即上面的 traceback。库层参照 PR#89 macos 绿。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions