我有一个MacBook M1,并在我的机器上安装了一个库,该库是为x86 / Intel体系结构编译的。我有一些使用OpenMP的源代码。我希望使用clang编译器编译我的代码并将我的可执行文件链接到x86库。
我能够编译没有x86依赖关系的源代码,方法是按照这里指令编译源代码,使用brew发布的clang实现。
但是,当我尝试用-arch x86_64参数编译并链接到x86库时,我发现clang试图将我的可执行文件链接到为arm64体系结构构建的OpenMP库。
在为MacBook M1构建OpenMP库的x86体系结构上安装clang版本是可能的吗?
下面是一个使用当前设置(即使没有链接到x86库)的错误示例。
源代码:
#include <omp.h>
int main()
{
return 0;
}调用编译器:
/opt/homebrew/opt/llvm/bin/clang++ -arch x86_64 omp_ex.cpp \
-L/opt/homebrew/opt/llvm/lib -Wl,-rpath,/opt/homebrew/opt/llvm/lib \
-I/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include错误消息:
ld: in '/opt/homebrew/opt/llvm/lib/libunwind.dylib', building for macOS-x86_64 but attempting to link with file built for macOS-arm64
clang-12: error: linker command failed with exit code 1 (use -v to see invocation)发布于 2021-05-06 12:31:44
使用x86安装brew解决了我的问题。下面是一组用于安装brew和clang的x86变体,然后编译C/C++代码的最小命令集:
# launch x86_64 shell
arch -x86_64 zsh
# install x86_64 variant of brew
arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
# install x86_64 variant of clang
arch -x86_64 /usr/local/bin/brew install llvm
# compile using x86_64 variant of clang
/usr/local/opt/llvm/bin/clang++ -arch x86_64 omp_ex.cppbrew应用程序现在安装在我的机器上的两个不同位置:
# arm64 (default) location
/opt/homebrew/bin/brew
# x86_64 location
/usr/local/bin/brewclang安装在三个不同的位置:
# Apple arm64 (default) location
/usr/bin/clang
# brew arm64 location
/opt/homebrew/opt/llvm/bin/clang
# brew x86_64 location
/usr/local/opt/llvm/bin/clang发布于 2021-05-06 08:10:22
Brew可以支持x86和Arm在MacOS M1机器上的并行安装。因此,您需要做的是使用x86安装集,并确保适当设置PATH。
它在/usr/local中安装/usr/local应用程序(例如/usr/local/bin/brew),在/opt/homebrew中安装aarch64应用程序(例如/opt/homebrew/bin/brew)。
发布于 2021-05-04 15:38:47
首先,在x86 ARM处理器上运行M1二进制文件是可能的,这要归功于罗塞塔,但这是实验性的,因此并不总是有效的。
在为MacBook M1构建OpenMP库的x86体系结构上安装clang版本是可能的吗?
多亏了交叉编译,这应该是可能的。至少,Clang理论上支持这一点(使用选项-target)。最好的方法是从包管理器中检索二进制文件,或者直接从源代码编译libomp (您可以遵循这里指令)。
请记住,虽然x86_64二进制文件可以使用Rosetta在M1处理器上运行,但不同体系结构的库不能混合在一起。这意味着您应该编译所有的依赖项(包括libomp的依赖项,尽管它不应该有太多的依赖项)。
最好的解决方案(可重用、更安全、更快和更简单)是使用本机库,因此可以为M1处理器重新构建库(如果需要的话可以从源)。
https://stackoverflow.com/questions/67386941
复制相似问题