为 macOS 构建,但链接为独立构建的目标文件

RPS*_*PSM 8 xcode ffmpeg llvm clang

我正在构建 ffmpeg 并且我收到几个文件的以下错误。我不是专门用独立的旗帜建造的,所以不明白为什么会这样。它实际上是什么意思?它有问题,还是一个可忽略的警告?如果有问题,有人知道如何解决吗?

Building for macOS, but linking in object file (~/Git/FFmpeg/FFmpegXcode/lib/libavutil.a(imgutils.o)) built for free standing
Run Code Online (Sandbox Code Playgroud)

Joh*_*ton 15

问题在于 FFmpeg 构建中的 .asm 文件。

苹果锵与目标平台,系统版本和SDK版本,它从拍摄对象文件嵌入一个特殊的加载命令-target-mmacosx-version-min或一些类似的命令行参数。

链接器然后检查所有被链接的目标文件中的此类加载命令,并在找不到此类命令或检测到不兼容时发出警告。

大多数其他编译器不知道该加载命令,也无法将其输出到目标文件中。至少在 YASM(它体现在本期)、D 和 Go 编译器Crystal 中都发现了问题

不幸的是,我找不到在 FFmpeg 中为 asm 源构建好的对象或禁用该警告的解决方法。我已经为 YASM创建了一个问题,但这是一个长镜头 - 首先您需要在 YASM 中使用此功能,然后您需要一种方法将所需的参数传递给 asm 源的 FFmpeg 构建。

更新

从 Xcode 12 开始,它成了一个问题,因为这个警告变成了一个错误,似乎没有办法禁用或忽略它。但看起来我已经设法使用tmm1建议的方法解决了这个问题。不幸的是,在当前阶段,它需要大量的手动工作。

  1. 我已经为缺少的加载命令分叉yasm并在输出对象文件中添加了填充。(用于构建调用./autogen.shmake
  2. 我已经分叉macho_edit添加了一种使用命令行调用附加所需加载命令的方法。(用于构建调用xcodebuild build -configuration Release -project macho_edit.xcodeproj -target macho_edit
  3. 创建了一个 shell 脚本,它包装了自定义构建的调用,yasm然后macho_edit使用必需的参数自定义构建(您可以设置要在此脚本中支持的 macos 版本和 sdk 版本)。
  4. 为了ffmpeg使用这个包装器进行构建,我复制macos_yasm_wrap.shffmpeg目录并添加--x86asmexe=`pwd`/macos_yasm_wrap.sh./configure调用的参数。

这似乎有效。正确的做法是将正确的命令行参数添加到yasm(如 Clang 支持的那些)并首先生成正确的加载命令。但我现在没有时间这样做:(