9.3. 从包装器编译器中提取标志
如果由于某些原因无法使用包装器编译器,有多种支持的方法可以提取所需的编译器/链接器标志。
9.3.1. 使用 --showme 选项
包装器编译器都支持一个--showme命令行选项,该选项可以显示原本会被调用的命令。
# Show the flags necessary to compile MPI C applications
shell$ mpicc --showme:compile
# Show the flags necessary to link MPI C applications
shell$ mpicc --showme:link
# Show all the flags necessary to build MPI C applications
shell$ mpicc --showme
注意
如果在包装器编译器中传递--showme 以及其他命令行参数,请确保同时传入一个文件名。否则,--showme功能将无法按预期显示输出。
警告
在Makefile(或其他构建系统)中硬编码这些结果几乎从来都不是一个好主意。通常最佳做法是以动态方式运行(例如)mpicc --showme:compile来获取所需信息。例如,GNU Make允许运行命令并将其结果赋值给变量:
MPI_COMPILE_FLAGS = $(shell mpicc --showme:compile)
MPI_LINK_FLAGS = $(shell mpicc --showme:link)
my_app: my_app.c
$(CC) $(MPI_COMPILE_FLAGS) my_app.c $(MPI_LINK_FLAGS) -o my_app
9.3.2. 使用 pkg-config
另外,Open MPI 还会在 $libdir/pkgconfig 目录下安装 pkg-config(1) 配置文件。如果配置了 pkg-config 来查找这些文件(例如,将 $libdir/pkgconfig ——通常是 $prefix/lib/pkgconfig ——添加到 PKG_CONFIG_PATH 环境变量中),那么编译/链接 Open MPI 程序可以像这样进行:
shell$ export PKG_CONFIG_PATH=/opt/openmpi/lib/pkgconfig
shell$ gcc hello_world_mpi.c -o hello_world_mpi -g \
`pkg-config ompi-c --cflags --libs`
shell$
Open MPI 提供了多个 pkg-config 配置文件;每种不同的包装器编译器(语言)对应一个:
ompi:ompi-c的同义词;使用C语言MPI绑定的Open MPI应用程序ompi-c: 使用C语言MPI绑定的Open MPI应用程序ompi-cxx: 使用C语言MPI绑定的Open MPI应用程序ompi-fort: 使用Fortran MPI绑定的Open MPI应用程序
注意
Open MPI的pkg-config文件能正常工作,但从技术规范角度来看可能并不完全正确。
具体来说:Open MPI会列出链接MPI应用程序所需的所有依赖库,即使某个依赖项拥有.pc文件并因此本应被列为Open MPI的.pc文件中的Requires和/或Requires.private。
例如,Open MPI在Libs和Libs.private中都列出了-lpmix。但由于PMIx提供了自己的pmix.pc文件,Open MPI更正确的做法是不要在Libs/Libs.private中列出-lpmix,而应该包含:
Requires: pmix
Requires.private: pmix
最终结果可能无关紧要,但我们仍记录在案,以防某天成为问题。
9.3.3. 使用 ompi_info
该方法并不直接适用于获取编译MPI应用程序所需的所有编译器/链接器标志,因为它未包含查找Open MPI头文件和库的相关标志。但它确实展示了所有其他标志的详细分类。
shell$ ompi_info --all | grep -i wrapper
Wrapper extra CFLAGS:
Wrapper extra CXXFLAGS:
Wrapper extra FFLAGS:
Wrapper extra FCFLAGS:
Wrapper extra LDFLAGS:
Wrapper extra LIBS: -lutil -lnsl -ldl -Wl,--export-dynamic -lm
此安装仅在包装器编译器的xLIBS区域添加选项;所有其他值均为空(请记住:-I和-L是隐式的)。
请注意,可以使用--parsable选项来获取机器可解析格式的输出。例如:
shell$ ompi_info --all --parsable | grep wrapper:extra
option:wrapper:extra_cflags:
option:wrapper:extra_cxxflags:
option:wrapper:extra_fflags:
option:wrapper:extra_fcflags:
option:wrapper:extra_ldflags:
option:wrapper:extra_libs:-lutil -lnsl -ldl -Wl,--export-dynamic -lm