与 conda 安装时如何设置 openmpi C 编译器?

问题描述 投票:0回答:1

我使用 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 编译器。

c macos clang conda openmpi
1个回答
0
投票

如果您使用 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环境?

© www.soinside.com 2019 - 2024. All rights reserved.