C++ 在macOS arm64体系结构上使用x86库和OpenMP

C++ 在macOS arm64体系结构上使用x86库和OpenMP,c++,macos,clang,openmp,apple-m1,C++,Macos,Clang,Openmp,Apple M1,我有一台MacBook M1,并在我的机器上安装了一个库,该库是为x86/Intel体系结构编译的。我有一些使用OpenMP的源代码。我想编译我的代码,并使用clang编译器将我的可执行文件链接到x86库 我能够按照说明,使用brew发布的clang实现编译没有x86依赖关系的源代码 但是,当我尝试使用-arch x86_64参数编译并链接到x86库时,我发现clang试图将我的可执行文件链接到为arm64体系结构构建的OpenMP库 是否可以在MacBook M1上安装一个版本的clang,其

我有一台MacBook M1,并在我的机器上安装了一个库,该库是为x86/Intel体系结构编译的。我有一些使用OpenMP的源代码。我想编译我的代码,并使用clang编译器将我的可执行文件链接到x86库

我能够按照说明,使用brew发布的clang实现编译没有x86依赖关系的源代码

但是,当我尝试使用
-arch x86_64
参数编译并链接到x86库时,我发现clang试图将我的可执行文件链接到为arm64体系结构构建的OpenMP库

是否可以在MacBook M1上安装一个版本的clang,其中OpenMP库是为x86架构构建的

下面是一个使用当前设置时出现的错误示例,即使未链接到x86库

源代码:

#include <omp.h>
int main()
{
    return 0;
}
错误消息:

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)

首先,得益于Rosetta,在M1 ARM处理器上运行x86二进制文件是可能的,但这是实验性的,因此并不总是可行的

是否可以在MacBook M1上安装一个版本的clang,其中OpenMP库是为x86架构构建的

这应该是可能的感谢。至少,Clang理论上支持这一点(使用选项
-target
)。 最好的方法是从包管理器中检索二进制文件或直接从编译libomp(您可以遵循这些指令)

请记住,虽然x86_64二进制文件可以在带有Rosetta的M1处理器上运行,但不同体系结构的库不能混合在一起。这意味着您应该编译所有依赖项(包括libomp的依赖项,尽管它不应该有很多依赖项)


最好的解决方案(推荐、更安全、更快和更简单)是使用本机库,从而为M1处理器重建库(如果需要,可以从源代码处重建)。

首先,由于Rosetta,在M1 ARM处理器上运行x86二进制文件是可能的,但这是实验性的,因此并不总是有效

是否可以在MacBook M1上安装一个版本的clang,其中OpenMP库是为x86架构构建的

这应该是可能的感谢。至少,Clang理论上支持这一点(使用选项
-target
)。 最好的方法是从包管理器中检索二进制文件或直接从编译libomp(您可以遵循这些指令)

请记住,虽然x86_64二进制文件可以在带有Rosetta的M1处理器上运行,但不同体系结构的库不能混合在一起。这意味着您应该编译所有依赖项(包括libomp的依赖项,尽管它不应该有很多依赖项)


最好的解决方案(推荐、更安全、更快和更简单)是使用本机库,从而为M1处理器重建库(如果需要,可能从源代码处重建)。

Brew可以支持MacOS M1机器上的并行x86和Arm安装。因此,您需要做的是使用x86安装集,并确保正确设置了
路径

它在
/usr/local
中安装x86_64应用程序(例如
/usr/local/bin/brew
),在
/opt/homebrew
中安装aarch64应用程序(例如
/opt/homebrew/bin/brew


请参阅

Brew可以支持MacOS M1机器上的并行x86和Arm安装。因此,您需要做的是使用x86安装集,并确保正确设置了
路径

它在
/usr/local
中安装x86_64应用程序(例如
/usr/local/bin/brew
),在
/opt/homebrew
中安装aarch64应用程序(例如
/opt/homebrew/bin/brew


请参阅使用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.cpp
brew应用程序现在安装在我的机器上的两个不同位置:

# arm64 (default) location
/opt/homebrew/bin/brew
# x86_64 location
/usr/local/bin/brew
clang安装在三个不同的位置:

# 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

使用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.cpp
brew应用程序现在安装在我的机器上的两个不同位置:

# arm64 (default) location
/opt/homebrew/bin/brew
# x86_64 location
/usr/local/bin/brew
clang安装在三个不同的位置:

# 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

上次我检查时,ARM处理器的汇编语言和微码与Intel处理器完全不同。而且两个都不能执行另一个的机器代码。这意味着,如果没有某种解释器,针对x86体系结构的可执行文件将无法在ARM平台上运行。@ThomasMatthews不用于解决该问题?上次我检查时,ARM处理器的汇编语言和微码与Intel处理器完全不同。而且两个都不能执行另一个的机器代码。这意味着,如果没有某种解释器,针对x86体系结构的可执行文件将无法在ARM平台上运行。@ThomasMatthews不用于解决该问题?我可以看出,如果您拥有库的源代码,并且有信心知道如何编译它,这是最好的解决方案。为了涵盖其他情况,您知道我是否可以为brew版本的clang提出功能请求?如果brew版本的clang支持-arch x86_64参数的方式与Apple版本的clang支持的方式相同,那就太好了。我可以看出,如果您拥有库的源代码并且有信心知道如何编译它,这是最好的解决方案。为了涵盖其他情况,您知道我是否可以为brew版本的clang提出功能请求?如果brew版本的clang以与Apple varia相同的方式支持-arch x86_64参数,那就太好了