【问题标题】:Building for macOS, but linking in object file built for free standing为 macOS 构建,但链接为独立构建的目标文件
【发布时间】:2019-11-11 06:04:49
【问题描述】:

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

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

【问题讨论】:

    标签: xcode ffmpeg clang llvm


    【解决方案1】:

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

    Apple Clang 在目标文件中嵌入了一个特殊的加载命令,其中包含目标平台、系统版本和 SDK 版本,它从 -target-mmacosx-version-min 或一些类似的命令行参数获取。

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

    大多数其他编译器不知道该加载命令,并且无法将其输出到目标文件中。至少在 YASM 中发现了问题(它体现在这个问题中),in D and Go compilersin Crystal

    不幸的是,我找不到在 FFmpeg 中为 asm 源构建好的对象或禁用该警告的解决方法。我已经创建了an issue for YASM,但这是一个远景——首先你需要 YASM 中的这个功能,然后你需要一种方法将所需的参数传递给 asm 源的 FFmpeg 构建。

    更新

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

    1. 我已将forked yasmadded padding 添加到缺少加载命令的输出目标文件中。 (用于建设电话./autogen.shmake
    2. 我有forked macho_editadded a way to append the required load command with a command line invocation。 (建设电话xcodebuild build -configuration Release -project macho_edit.xcodeproj -target macho_edit
    3. 我有created a shell script,它封装了对自定义yasm 的调用,然后使用所需参数自定义了macho_edit(您可以设置要在此脚本中支持的macos 版本和sdk 版本) .
    4. 要使用此包装器构建ffmpeg,我将macos_yasm_wrap.sh 复制到ffmpeg 目录并将--x86asmexe=`pwd`/macos_yasm_wrap.sh 参数添加到./configure 调用。

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

    【讨论】:

    • 很好的答案,谢谢!一切似乎都正常,所以我认为没有影响?
    • 希望没有影响。使用适当的命令行参数,Apple Clang 在编译时检查目标系统中没有可用的方法。如果目标文件是由其他一些编译器编译的,比如 YASM,所有的赌注都没有了,你只希望它们生成的代码可以在你的目标系统上毫无问题地运行。我真的希望 FFmpeg 不会在他们的 asm 模块中使用任何非常棘手的东西,这会导致它在某些 Apple 系统中无法工作。
    • 仅供参考,FFmpeg 的默认汇编程序在 v3.4 中从 yasm 更改为 nasm。我认为最便携的解决方案是可以与 configure --x86asmexe= 一起使用的包装器,它可以调用 yasm/nasm,然后编辑生成的对象以添加缺少的男子气概加载命令。
    • @tmm1 感谢您的想法,我尝试以某种方式实现它并将结果添加到我的答案中。
    【解决方案2】:

    我知道这个问题是针对 macOS 的,但是在为模拟器(intel archs,而不是 arm)构建时,我也为 iOS 和 tvOS 得到了这个问题。虽然https://stackoverflow.com/a/59103419/1777839 肯定会解释为什么会发生这种情况,但它并没有提供“修复”。

    这不是一个完美的解决方案,更多的是一种解决方法,但它帮助了我,所以我想分享它,以防其他人来到这里遇到同样的问题。

    当您为 iOS 或 tvOS 模拟器构建 FFmpeg 时,如果您将 --disable-asm 标志传递给 configure,这将使链接器错误消失。是的,它为模拟器禁用了优化的 FFmpeg 组装件,但由于它仍然适用于 ARM 设备,因此我将其写为可接受的解决方案。虽然为物理设备和模拟器使用相同的 FFmpeg 构建选项会很好,但至少这可以让它再次工作。

    另一个可行的选择是使用 Xcode 10 构建 FFmpeg,但是您不能使用 iOS/tvOS 13 SDK(不过我认为这并不重要)。此外,谁愿意为了编译库而切换 Xcode?​​p>

    【讨论】:

    • 如何通过 --disable-asm 标志在 x-code 中进行配置我无法找到选项,您可以指导步骤
    • 你不要在 Xcode 中传递它:“当你为 iOS 或 tvOS 模拟器构建 FFmpeg 时,如果你传递 --disable-asm 标志来配置,这将使链接器错误消失。 "
    猜你喜欢
    • 2021-04-24
    • 1970-01-01
    • 2021-09-24
    • 2022-01-04
    • 2020-12-08
    • 2022-06-23
    • 2023-03-09
    • 2021-01-17
    • 2021-06-25
    相关资源
    最近更新 更多