为 macOS 构建,但链接到为独立构建的目标文件
Building for macOS, but linking in object file built for free standing
我正在构建 ffmpeg,我收到了几个文件的以下错误。我不是专门用独立旗帜建造的,所以看不出为什么会这样。它到底是什么意思?它有问题,还是可以忽略的警告?如果有问题,有人知道如何解决吗?
Building for macOS, but linking in object file (~/Git/FFmpeg/FFmpegXcode/lib/libavutil.a(imgutils.o)) built for free standing
问题出在 FFmpeg 构建中的 .asm 文件。
Apple Clang 在目标文件中嵌入了一个特殊的加载命令,其中包含目标平台、系统版本和 SDK 版本,它从 -target
或 -mmacosx-version-min
或一些类似的命令行参数中获取。
然后链接器会在所有被链接的目标文件中检查此类加载命令,并在找不到此类命令或检测到不兼容时发出警告。
大多数其他编译器都不知道该加载命令,因此无法将其输出到目标文件中。至少在 YASM 中看到了问题(它体现在这个问题中),in D and Go compilers, in Crystal。
不幸的是,我找不到解决方法来为 FFmpeg 中的 asm 源构建良好的对象或禁用该警告。我已经创建了 an issue for YASM 但这是一个远景 - 首先您需要在 YASM 中使用此功能,然后您需要一种方法将所需的参数传递给 FFmpeg 构建以获取 asm 源。
更新
从 Xcode 12 开始就成了问题,因为这个警告变成了一个错误,而且似乎没有办法禁用或忽略它。但看起来我已经设法使用 tmm1 建议的方法破解了这个问题。不幸的是,在当前阶段,它需要大量的手动工作。
- 我已经 forked
yasm
and added padding 为丢失的加载命令添加了输出目标文件。 (用于构建调用 ./autogen.sh
和 make
)
- 我 forked
macho_edit
and added a way to append the required load command with a command line invocation。 (建筑调用 xcodebuild build -configuration Release -project macho_edit.xcodeproj -target macho_edit
)
- 我已经 created a shell script 包装了自定义构建
yasm
的调用,然后使用所需的参数自定义构建 macho_edit
(您可以设置您想要的 macos 版本和 sdk 版本显示在此脚本中受支持)。
- 要使用此包装器构建
ffmpeg
,我将 macos_yasm_wrap.sh
复制到 ffmpeg
目录并向 ./configure
调用添加 --x86asmexe=`pwd`/macos_yasm_wrap.sh
参数。
这似乎有效。这样做的正确方法是向 yasm
添加正确的命令行参数(就像 Clang 支持的那样)并首先生成正确的加载命令。但是我现在没有时间这样做:(
我知道这个问题是针对 macOS 的,但我在为模拟器(intel archs,而不是 arm)构建时也得到了 iOS 和 tvOS 的问题。虽然 确实解释了为什么会发生这种情况,但它并没有提供“修复”。
这不是一个完美的修复,更多的是变通,但它帮助了我,所以我想分享它以防其他人遇到我遇到的同样问题。
当您为 iOS 或 tvOS 模拟器构建 FFmpeg 时,如果您将 --disable-asm
标志传递给 configure
,这将使链接器错误消失。是的,它为模拟器禁用了 FFmpeg 的优化汇编部分,但由于它仍然适用于 ARM 设备,我将其作为可接受的解决方案注销了。虽然为物理设备和模拟器使用相同的 FFmpeg 构建选项会很好,但至少这可以让它再次工作。
另一个可行的选项是使用 Xcode 10 构建 FFmpeg,但是你不能使用 iOS/tvOS 13 SDK(不过我认为这并不重要)。此外,谁愿意处理切换 Xcode 只是为了编译一个库?
我正在构建 ffmpeg,我收到了几个文件的以下错误。我不是专门用独立旗帜建造的,所以看不出为什么会这样。它到底是什么意思?它有问题,还是可以忽略的警告?如果有问题,有人知道如何解决吗?
Building for macOS, but linking in object file (~/Git/FFmpeg/FFmpegXcode/lib/libavutil.a(imgutils.o)) built for free standing
问题出在 FFmpeg 构建中的 .asm 文件。
Apple Clang 在目标文件中嵌入了一个特殊的加载命令,其中包含目标平台、系统版本和 SDK 版本,它从 -target
或 -mmacosx-version-min
或一些类似的命令行参数中获取。
然后链接器会在所有被链接的目标文件中检查此类加载命令,并在找不到此类命令或检测到不兼容时发出警告。
大多数其他编译器都不知道该加载命令,因此无法将其输出到目标文件中。至少在 YASM 中看到了问题(它体现在这个问题中),in D and Go compilers, in Crystal。
不幸的是,我找不到解决方法来为 FFmpeg 中的 asm 源构建良好的对象或禁用该警告。我已经创建了 an issue for YASM 但这是一个远景 - 首先您需要在 YASM 中使用此功能,然后您需要一种方法将所需的参数传递给 FFmpeg 构建以获取 asm 源。
更新
从 Xcode 12 开始就成了问题,因为这个警告变成了一个错误,而且似乎没有办法禁用或忽略它。但看起来我已经设法使用 tmm1 建议的方法破解了这个问题。不幸的是,在当前阶段,它需要大量的手动工作。
- 我已经 forked
yasm
and added padding 为丢失的加载命令添加了输出目标文件。 (用于构建调用./autogen.sh
和make
) - 我 forked
macho_edit
and added a way to append the required load command with a command line invocation。 (建筑调用xcodebuild build -configuration Release -project macho_edit.xcodeproj -target macho_edit
) - 我已经 created a shell script 包装了自定义构建
yasm
的调用,然后使用所需的参数自定义构建macho_edit
(您可以设置您想要的 macos 版本和 sdk 版本显示在此脚本中受支持)。 - 要使用此包装器构建
ffmpeg
,我将macos_yasm_wrap.sh
复制到ffmpeg
目录并向./configure
调用添加--x86asmexe=`pwd`/macos_yasm_wrap.sh
参数。
这似乎有效。这样做的正确方法是向 yasm
添加正确的命令行参数(就像 Clang 支持的那样)并首先生成正确的加载命令。但是我现在没有时间这样做:(
我知道这个问题是针对 macOS 的,但我在为模拟器(intel archs,而不是 arm)构建时也得到了 iOS 和 tvOS 的问题。虽然
这不是一个完美的修复,更多的是变通,但它帮助了我,所以我想分享它以防其他人遇到我遇到的同样问题。
当您为 iOS 或 tvOS 模拟器构建 FFmpeg 时,如果您将 --disable-asm
标志传递给 configure
,这将使链接器错误消失。是的,它为模拟器禁用了 FFmpeg 的优化汇编部分,但由于它仍然适用于 ARM 设备,我将其作为可接受的解决方案注销了。虽然为物理设备和模拟器使用相同的 FFmpeg 构建选项会很好,但至少这可以让它再次工作。
另一个可行的选项是使用 Xcode 10 构建 FFmpeg,但是你不能使用 iOS/tvOS 13 SDK(不过我认为这并不重要)。此外,谁愿意处理切换 Xcode 只是为了编译一个库?