Mac 编译问题解决——building for macOS-x86_64 but attempting to link with file built for
2023-12-23 07:28:19
解决 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 架构。但是,这仅适用于你可以访问目标文件的情况。