Perl脚本调用configure编译MPICH时选项传递失败求助
Perl调用MPICH configure时参数传递错误导致编译失败
你的问题核心是没有正确给capturex传递命令行参数:capturex(以及IPC::System::Simple里的其他类似函数)不会像shell那样自动拆分空格分隔的字符串,你把所有configure选项塞进一个字符串里,会被当成configure的单个参数,而非多个独立选项。configure解析时会混乱,最终把这些错误的"参数"传递给gcc,导致编译报错。
解决方法:用数组传递每个独立选项
把每个configure选项作为数组的单独元素,再传给capturex,这样每个选项都会被正确识别为独立的命令行参数:
print "Configuring MPICH...\n"; my @conf_options = ( "--prefix=$prefix", "--enable-shared=no", "--enable-fast=O3,ndebug", "--disable-error-checking", "--enable-fortran=all", "--enable-cxx", "--disable-opencl", "--enable-romio", "--without-timing", "--without-mpit-pvars", ); $txt = capturex('../configure', @conf_options); writef('c.txt', $txt);
为什么之前的数组尝试失败?
如果你之前只是把整个选项字符串放进数组的一个元素(比如my @conf_options = (qq(--prefix=...))),那本质还是单个参数,和用字符串的问题完全一样。必须确保每个--xxx选项都是数组的独立元素。
修正后的完整脚本
#!/usr/local/bin/perl use v5.38; use autodie; use strict; use warnings; use IPC::System::Simple qw(capturex); # Writes text into given file sub writef($fname, $txt) { open my $fh, ">:encoding(UTF-8)", $fname; print $fh $txt; close $fh; } my $gnubin ='/opt/local/bin'; my $prefix ='/opt/mpich-4.1.2'; my $np = 8; my $txt; print "Setting environment variables...\n"; $ENV{'FC'} = $gnubin . '/gfortran'; $ENV{'F77'} = $ENV{'FC'}; $ENV{'CC'} = $gnubin . '/gcc'; $ENV{'CXX'} = $gnubin . '/g++'; $ENV{'FFLAGS'} = '-m64 -fallow-argument-mismatch'; $ENV{'CFLAGS'} = '-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -m64'; mkdir 'build'; chdir 'build'; print "Configuring MPICH...\n"; my @conf_options = ( "--prefix=$prefix", "--enable-shared=no", "--enable-fast=O3,ndebug", "--disable-error-checking", "--enable-fortran=all", "--enable-cxx", "--disable-opencl", "--enable-romio", "--without-timing", "--without-mpit-pvars", ); $txt = capturex('../configure', @conf_options); writef('c.txt', $txt); print "Compiling MPICH...\n"; $txt = capturex('make', '-j', $np); writef('m.txt', $txt);
这样configure就能正确解析每个选项,后续编译时也不会把configure的选项错误传递给gcc了。
内容的提问来源于stack exchange,提问作者mabalenk
相关产品推荐
相关产品推荐

