4.7. 指定编译器与编译选项

修改Open MPI用于构建自身的编译器,需要使用标准的GNU Autoconf机制,即在调用configure之前或在configure命令行本身设置特殊的环境变量。

以下环境变量被 configure 识别:

  • CC: 使用的C编译器

  • CFLAGS: 传递给C编译器的编译标志

  • CPPFLAGS: 传递给C编译器的预处理器标志

  • CXX: 使用的C++编译器

  • CXXCFLAGS: 传递给C++编译器的编译标志

  • CXXCPPFLAGS: 传递给C++编译器的预处理标志

  • FC: 使用的Fortran编译器

  • FCFLAGS: 传递给Fortran编译器的编译标志

  • LDFLAGS: 传递给所有编译器的链接器标志

  • LIBS: 传递给所有编译器的库文件(用户很少需要指定额外的LIBS

  • PKG_CONFIG: pkg-config工具的路径

注意

Open MPI v5.0.x 不包含任何 C++ 代码。configure 使用 C++ 编译器运行的唯一测试是为了确定 mpic++ wrapper compiler 中使用的 CXX 的适当值。CXXCFLAGSCXXCPPFLAGS用于这些 configure 检查,以确保 C++ 编译器正常工作。

例如,使用特定版本的gccg++gfortran进行构建:

shell$ ./configure \
    CC=/opt/gcc-a.b.c/bin/gcc \
    CXX=/opt/gcc-a.b.c/bin/g++ \
    FC=/opt/gcc-a.b.c/bin/gfortran ...

这是另一个示例,这次展示使用英特尔编译器套件进行构建:

shell$ ./configure \
    CC=icc \
    CXX=icpc \
    FC=ifort ...

注意

Open MPI社区通常建议使用上述命令行形式来设置不同的编译器(而不是设置环境变量后再调用./configure)。这种形式会将所有变量和值保存在config.log文件中,如果出现问题,可以更方便地进行事后分析。

请注意,您指定的标志必须与所有编译器兼容。特别是,针对某一语言编译器指定的标志所生成的代码,必须能够与其他语言编译器生成的代码进行编译和链接。例如,在默认生成32位可执行文件的64位系统上:

# Assuming the GNU compiler suite
shell$ ./configure CFLAGS=-m64 ...

将生成64位的C对象,但Fortran对象仍为32位。这些代码将彼此不兼容,Open MPI将无法成功构建。因此,您必须为所有语言指定构建64位对象:

# Assuming the GNU compiler suite
shell$ ./configure CFLAGS=-m64 FCFLAGS=-m64 ...

上述命令行会将-m64参数传递给所有编译器,因此将为所有语言生成64位对象。

警告

请注意,设置CFLAGS(等参数)不会影响包装编译器使用的标志。在上述示例中,您可能还需要向各种--with-wrapper-FOO选项添加-m64参数:

shell$ ./configure CFLAGS=-m64 FCFLAGS=-m64 \
     --with-wrapper-cflags=-m64 \
     --with-wrapper-cxxflags=-m64 \
     --with-wrapper-fcflags=-m64 ...

如果不这样做,将导致MPI应用程序无法正确编译/链接。

更多详情请参阅自定义包装编译器行为部分。

请注意,如果您打算使用非默认路径中的make来编译Open MPI,则必须在调用Open MPI的configure脚本之前设置$MAKE环境变量,或者向configure传递MAKE=your_make_prog参数。例如:

shell$ ./configure MAKE=/path/to/my/make ...

例如,如果您为make设置了shell别名,或者出于习惯总是输入gmake,就可能出现这种情况。如果未能告知configure您将使用哪个非默认的make来编译Open MPI,可能会导致未定义的行为(意思是:不要这样做)。

请注意,您可能还需要确保为您的构建环境正确设置(或不设置)LD_LIBRARY_PATH的值(或适用于您操作系统的相关环境变量)。例如,有些用户通过FC环境变量设置为使用非默认的Fortran编译器,但未能将LD_LIBRARY_PATH设置为包含该非默认Fortran编译器的支持库目录,这会导致Open MPI的configure脚本在尝试编译/链接/运行简单的Fortran程序时失败。

要求指定的编译器必须具有编译和链接兼容性,这意味着由一个编译器生成的目标文件必须能够与其他编译器生成的目标文件链接,并生成功能正确的可执行文件。

4.7.1. 静态链接至Intel编译器套件库

默认情况下,Intel编译器套件会动态链接其运行时库到Open MPI二进制文件和库。如果Intel编译器库安装在非标准位置,可能会导致问题。例如,您可能会遇到如下错误:

error while loading shared libraries: libimf.so: cannot open shared object file:
No such file or directory

为避免此类问题,您可以通过向Open MPI的配置脚本传递参数,指示Intel编译器套件将其运行时库与Open MPI进行静态链接:

shell$ ./configure CC=icc CXX=icpc FC=ifort LDFLAGS=-Wc,-static-intel ...