返回

Mac 编译问题解决——building for macOS-x86_64 but attempting to link with file built for

人工智能

解决 Mac 上编译 TVM 遇到的 “building for macOS-x86_64 but attempting to link with file built for” 错误

概述

在 macOS 上编译 TVM 的 fork 版本时,你可能会遇到以下报错:

building for macOS-x86_64 but attempting to link with file built for i386

这通常表明你的系统使用的是 GNU 版本的 ranlib 命令,而不是 Apple 版本,而 GNU 版本与你正在使用的编译工具链不兼容。

错误原因

Mac 上有两个编译器工具链:Apple LLVM 和 GNU。Apple LLVM 工具链使用 Apple 版本的 ranlib,而 GNU 工具链使用 GNU 版本。默认情况下,系统会优先使用 GNU 版本。

如果你使用 Apple LLVM 工具链编译程序,但链接到由 GNU 版本的 ranlib 生成的库文件,就会出现上述错误。

解决办法

有两种方法可以解决此错误:

1. 将系统默认的 ranlib 命令改为 Apple 版本

sudo ln -sf /usr/bin/ranlib-apple /usr/bin/ranlib

2. 在编译时显式指定使用 Apple 版本的 ranlib 命令

export LDFLAGS=-Wl,-ranlib=/usr/bin/ranlib-apple

代码示例

使用 GNU 版本的 ranlib 命令

$ gcc -o myprogram myprogram.c -lmylibrary

使用 Apple 版本的 ranlib 命令

$ export LDFLAGS=-Wl,-ranlib=/usr/bin/ranlib-apple
$ gcc -o myprogram myprogram.c -lmylibrary

总结

本文介绍了如何解决在 Mac 上编译 TVM 时出现的 “building for macOS-x86_64 but attempting to link with file built for” 错误。通过将系统默认的 ranlib 命令更改为 Apple 版本,或在编译时显式指定使用 Apple 版本,你可以解决此问题。

常见问题解答

1. 什么是 ranlib 命令?

ranlib 命令用于创建和更新存档库。它将目标文件链接到一个存档中,并为链接器提供有关每个目标文件的符号表的信息。

2. 为什么使用 GNU 版本的 ranlib 会出现错误?

Apple LLVM 工具链需要 Apple 版本的 ranlib 来正确处理符号表。GNU 版本的 ranlib 不兼容,会导致链接时出现错误。

3. 如何检查我是否在使用 GNU 版本的 ranlib?

你可以运行以下命令来检查你正在使用的 ranlib 版本:

ranlib --version

4. 我应该始终使用 Apple 版本的 ranlib 吗?

如果你使用 Apple LLVM 工具链编译程序,则应始终使用 Apple 版本的 ranlib。如果你使用 GNU 工具链,则可以使用 GNU 版本的 ranlib。

5. 还有其他解决此错误的方法吗?

另一种解决此错误的方法是使用 lipo 命令将 i386 架构的目标文件转换为 x86_64 架构。但是,这仅适用于你可以访问目标文件的情况。