我使用 anaconda conda-forge 通道将 openmpi v4.1.6 (和依赖项)安装到干净的环境中。安装并尝试编译后,出现错误
--------------------------------------------------------------------------
The Open MPI wrapper compiler was unable to find the specified compiler
x86_64-apple-darwin13.4.0-clang in your PATH.
Note that this compiler was either specified at configure time or in
one of several possible environment variables.
--------------------------------------------------------------------------
经过一些额外的挖掘,
$ mpicc --showme
显示x86_64-apple-darwin13.4.0-clang
已被选为C编译器,但这是错误的clang版本! $ clang --version
回归
Apple clang version 14.0.3 (clang-1403.0.22.14.1)
Target: x86_64-apple-darwin22.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
这可以通过导出变量
OMPI_CC=clang
或 OMPI_CC=gcc
来解决,尽管 openmpi 文档 似乎强烈反对这样做,或者至少暗示这不是必需的。
openmpi 从哪里获取这个编译器信息?为什么它链接到不再存在的 C 编译器?我可以更改此默认行为吗?
使用 conda 安装最新版本的 openmpi 成功,但链接到错误的 C 编译器。
$ mpicc --showme
x86_64-apple-darwin13.4.0-clang -I/Users/ericvc/opt/anaconda3/envs/fargo-workshop/include -I/Users/ericvc/opt/anaconda3/envs/fargo-workshop/include -L/Users/ericvc/opt/anaconda3/envs/fargo-workshop/lib -L/Users/ericvc/opt/anaconda3/envs/fargo-workshop/lib -Wl,-rpath,/Users/ericvc/opt/anaconda3/envs/fargo-workshop/lib -lmpi
$ clang --version
Apple clang version 14.0.3 (clang-1403.0.22.14.1)
Target: x86_64-apple-darwin22.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
$ which -a clang
/usr/bin/clang
在我更改 OMPI_CC 变量之前,openmpi 不会编译和运行任何内容
$ export OMPI_CC=gcc
但每次打开新的 bash 配置文件时我都需要执行此操作(而且在我看来,这是一个实际上没有必要的解决方法)
编辑:
非常感谢 Dmitry 帮助我解决了这个问题。我创建了一些测试环境,因为我发现从 conda-forge 安装 gfortran 可以解决问题。
我创建了三个 python 环境,一个仅安装了 openmpi,一个首次使用 conda-forge 安装了 clang,一个首次使用 conda-forge 安装了 gfortran。结果如下,我省略了 anaconda 的长安装信息。
(base) $ conda create -n onlympi python
(base) $ conda activate onlympi
(onlympi) $ conda install -c conda-forge openmpi
(onlympi) $ mpicc --showme
x86_64-apple-darwin13.4.0-clang -I/Users/ericvc/opt/anaconda3/envs/onlympi/include -I/Users/ericvc/opt/anaconda3/envs/onlympi/include -L/Users/ericvc/opt/anaconda3/envs/onlympi/lib -L/Users/ericvc/opt/anaconda3/envs/onlympi/lib -Wl,-rpath,/Users/ericvc/opt/anaconda3/envs/onlympi/lib -lmpi
(onlympi) $ echo $CC
(onlympi) $ which x86_64-apple-darwin13.4.0-clang
x86_64-apple-darwin13.4.0-clang not found
(base) $ conda create -n clang-first python
(base) $ conda activate clang-first
(clang-first) $ conda install -c conda-forge clang
(clang-first) $ conda install -c conda-forge openmpi
(clang-first) $ mpicc --showme
x86_64-apple-darwin13.4.0-clang -I/Users/ericvc/opt/anaconda3/envs/clang-first/include -I/Users/ericvc/opt/anaconda3/envs/clang-first/include -L/Users/ericvc/opt/anaconda3/envs/clang-first/lib -L/Users/ericvc/opt/anaconda3/envs/clang-first/lib -Wl,-rpath,/Users/ericvc/opt/anaconda3/envs/clang-first/lib -lmpi
(clang-first) $ echo $CC
(clang-first) $ which x86_64-apple-darwin13.4.0-clang
x86_64-apple-darwin13.4.0-clang not found
(base) $ conda create -n gfortran-first python
(base) $ conda activate gfortran-first
(gfortran-first) $ conda install -c conda-forge gfortran
(gfortran-first) $ conda install -c conda-forge openmpi
(gfortran-first) $ mpicc --showme
x86_64-apple-darwin13.4.0-clang -I/Users/ericvc/opt/anaconda3/envs/gfortran-first/include -I/Users/ericvc/opt/anaconda3/envs/gfortran-first/include -L/Users/ericvc/opt/anaconda3/envs/gfortran-first/lib -L/Users/ericvc/opt/anaconda3/envs/gfortran-first/lib -Wl,-rpath,/Users/ericvc/opt/anaconda3/envs/gfortran-first/lib -lmpi
(gfortran-first) $ echo $CC
x86_64-apple-darwin13.4.0-clang
(gfortran-first) $ which x86_64-apple-darwin13.4.0-clang
/Users/ericvc/opt/anaconda3/envs/gfortran-first/bin/x86_64-apple-darwin13.4.0-clang
如您所见,所有三个环境都使用相同的 openmpi C 编译器,但只有当我安装 gfortran 时,该编译器才存在于环境中。
gfortran 安装了很多依赖项,我将它们包含在这里。特别令人感兴趣的是与 gfortran 一起安装的 clang 软件包,但除此之外没有:
clang_impl_osx-64
和 clang_osx-64
$ conda install -c conda-forge clang
Collecting package metadata (current_repodata.json): done
Solving environment: done
## Package Plan ##
environment location: /Users/ericvc/opt/anaconda3/envs/clang-first
added / updated specs:
- clang
The following NEW packages will be INSTALLED:
clang conda-forge/osx-64::clang-17.0.6-hac416ee_2
clang-17 conda-forge/osx-64::clang-17-17.0.6-default_h6b1ee41_2
icu conda-forge/osx-64::icu-73.2-hf5e326d_0
libclang-cpp17 conda-forge/osx-64::libclang-cpp17-17.0.6-default_h6b1ee41_2
libcxx conda-forge/osx-64::libcxx-16.0.6-hd57cbcb_0
libiconv conda-forge/osx-64::libiconv-1.17-hd75f5a5_2
libllvm17 conda-forge/osx-64::libllvm17-17.0.6-hbedff68_1
libxml2 conda-forge/osx-64::libxml2-2.12.4-hc0ae0f7_1
zstd conda-forge/osx-64::zstd-1.5.5-h829000d_0
$ conda install -c conda-forge gfortran
Collecting package metadata (current_repodata.json): done
Solving environment: done
## Package Plan ##
environment location: /Users/ericvc/opt/anaconda3/envs/gfortran-first
added / updated specs:
- gfortran
The following NEW packages will be INSTALLED:
cctools conda-forge/osx-64::cctools-973.0.1-h5b2de21_15
cctools_osx-64 conda-forge/osx-64::cctools_osx-64-973.0.1-h031c385_15
clang conda-forge/osx-64::clang-17.0.6-hac416ee_2
clang-17 conda-forge/osx-64::clang-17-17.0.6-default_h6b1ee41_2
clang_impl_osx-64 conda-forge/osx-64::clang_impl_osx-64-17.0.6-h1af8efd_8
clang_osx-64 conda-forge/osx-64::clang_osx-64-17.0.6-hb91bd55_8
clangxx conda-forge/osx-64::clangxx-17.0.6-default_h6b1ee41_2
compiler-rt conda-forge/osx-64::compiler-rt-17.0.6-ha38d28d_1
compiler-rt_osx-64 conda-forge/noarch::compiler-rt_osx-64-17.0.6-ha38d28d_1
gfortran conda-forge/osx-64::gfortran-13.2.0-h2c809b3_1
gfortran_impl_osx~ conda-forge/osx-64::gfortran_impl_osx-64-13.2.0-h7643cbd_1
gfortran_osx-64 conda-forge/osx-64::gfortran_osx-64-13.2.0-h18f7dce_1
gmp conda-forge/osx-64::gmp-6.3.0-h93d8f39_0
icu conda-forge/osx-64::icu-73.2-hf5e326d_0
isl conda-forge/osx-64::isl-0.25-hb486fe8_0
ld64 conda-forge/osx-64::ld64-609-h0a3eb4e_15
ld64_osx-64 conda-forge/osx-64::ld64_osx-64-609-hd3532be_15
libclang-cpp17 conda-forge/osx-64::libclang-cpp17-17.0.6-default_h6b1ee41_2
libcxx conda-forge/osx-64::libcxx-16.0.6-hd57cbcb_0
libgfortran conda-forge/osx-64::libgfortran-5.0.0-13_2_0_h97931a8_1
libgfortran-devel~ conda-forge/noarch::libgfortran-devel_osx-64-13.2.0-h80d4556_1
libgfortran5 conda-forge/osx-64::libgfortran5-13.2.0-h2873a65_1
libiconv conda-forge/osx-64::libiconv-1.17-hd75f5a5_2
libllvm17 conda-forge/osx-64::libllvm17-17.0.6-hbedff68_1
libxml2 conda-forge/osx-64::libxml2-2.12.4-hc0ae0f7_1
llvm-openmp conda-forge/osx-64::llvm-openmp-17.0.6-hb6ac08f_0
llvm-tools conda-forge/osx-64::llvm-tools-17.0.6-hbedff68_1
mpc conda-forge/osx-64::mpc-1.3.1-h81bd1dd_0
mpfr conda-forge/osx-64::mpfr-4.2.1-h0c69b56_0
sigtool conda-forge/osx-64::sigtool-0.1.3-h88f4db0_0
tapi conda-forge/osx-64::tapi-1100.0.11-h9ce4665_0
zlib conda-forge/osx-64::zlib-1.2.13-h8a1eda9_5
zstd conda-forge/osx-64::zstd-1.5.5-h829000d_0
tl;dr 如果有人发现自己遇到同样的问题:安装 gfortran。这将使 conda 设置适合环境的正确 C 编译器。
如果您使用 Conda 从
openmpi
频道安装了 conda-forge
,那么 C 编译器对我来说看起来不错,因为 conda 使用自己的编译器:在 Linux 下它是 gcc
,在 macOS 下它是 clang
。然而,正如您所看到的,它们的名称更加复杂并且编码有关平台(操作系统)的信息。
例如,我在Linux中工作,在conda环境中依赖于C编译器,实际的C编译器是
path-to-the-conda-environment/bin/x86_64-conda-linux-gnu-cc
。
为了更改实际的 C 编译器,Conda 设置了
CC
环境变量,这就是为什么 openmpcc
在您的情况下不仅指向 clang
,还指向 x86_64-apple-darwin13.4.0-clang
。您可以通过在shell命令中执行echo $CC
来检查它。 CC
代表“C 编译器”,基本上所有构建工具都会尊重此环境变量的值(如果已设置)。
问题是,为什么在
PATH
中找不到实际的C编译器。
您是否激活了安装了
openmpi
的Conda环境?