Windows下编译Quantum Espresso的KGEC后处理器make报错求助
在Windows环境编译Quantum Espresso的KGEC后处理器时遇到
cp: target 'kgec.x' is not a directory错误 我第一次使用make工具,尝试在Windows环境下编译Quantum Espresso的KGEC后处理器。我理解主Makefile的逻辑是:将src文件夹和对应版本的Makefile复制到SRCDIR目录,再进入该目录执行子Makefile的kgec.x规则。但执行make命令时,PowerShell返回错误cp: target 'kgec.x' is not a directory,可子Makefile中并未包含cp命令。
主Makefile代码
QEV=6.1 DQEV=QE6 TYPE=mpi QE=F:/Software/qe-6.6 #=================================================================== ifneq (,$(findstring QE6, $(DQEV))) include $(QE)/make.inc endif ifneq (,$(findstring QE5, $(DQEV))) include $(QE)/make.sys endif F90FLAGS += -D__$(DQEV) #F90FLAGS = -O0 -debug all -check all -traceback -fpp -D__$(DQEV) #-fpe3 #-ftrapuv #-fpe:0 export SRCDIR=./for-qe-$(QEV)-$(TYPE) #=================================================================== all : (cp -r ./src $(SRCDIR); cp makefiles/Makefile.for-qe-$(QEV) $(SRCDIR); \ cd $(SRCDIR); pwd; $(MAKE) -f Makefile.for-qe-$(QEV) kgec.x || exit 1) clean : rm -fr $(SRCDIR)
错误输出
PS F:\Software\kgec-v2.1> make (cp -r ./src ./for-qe-6.1-mpi; cp makefiles/Makefile.for-qe-6.1 ./for-qe-6.1-mpi; \ cd ./for-qe-6.1-mpi; pwd; C:/ProgramData/chocolatey/lib/make/tools/install/bin/make.exe -f Makefile.for-qe-6.1 kgec.x || exit 1) cp: target `kgec.x' is not a directory make: *** [Makefile:66: all] Error 1
子Makefile代码
# # Makefile for kgec (( K)ubo-(G)reenwood (E)lectrical (C)onductivity ) # By Lazaro Calderin # Oct, 2016 # MODULESM = -I $(QE)/Modules -I $(QE)/PW/src -I ../src PPOBJS = $(QE)/PP/src/openfil_pp.o PWOBJS = $(QE)/PW/src/libpw.a QEOBJS = $(QE)/Modules/libqemod.a $(QE)/FFTXlib/libqefft.a $(QE)/LAXlib/libqela.a MODULES = $(MODULESM) $(PWOBJS) $(QEOBJS) LIBOBJS = $(QE)/clib/clib.a $(QE)/iotk/src/libiotk.a #================================================================ all : kgec.x kgecout.o : kgecout.f90 $(MPIF90) $(F90FLAGS) -c $^ -o $@ $(MODULES) -warn all kgecgradient.o : kgecpaw.mod apawgm.mod qe_p_psi.mod kgecgradient.f90 $(MPIF90) $(F90FLAGS) -c $^ -o $@ $(MODULES) -warn all kgecpaw.o : kgecpaw.f90 $(MPIF90) $(F90FLAGS) -c $^ -o $@ $(MODULES) -warn all kgecchecks.o : kgecpaw.mod kgecchecks.f90 $(MPIF90) $(F90FLAGS) -c $^ -o $@ $(MODULES) -warn all parallel.o : parallel.f90 $(MPIF90) $(F90FLAGS) -c $^ -o $@ $(MODULES) -warn all kgecvars.o : kgecvars.f90 $(MPIF90) $(F90FLAGS) -c $^ -o $@ $(MODULES) -warn all kgsigma1.o : kgecvars.mod kgsigma1.f90 $(MPIF90) $(F90FLAGS) -c $^ -o $@ $(MODULES) -warn all kgsigma2.o : kgecvars.mod kgsigma2.f90 $(MPIF90) $(F90FLAGS) -c $^ -o $@ $(MODULES) -warn all qevars.o: qevars.f90 $(MPIF90) $(F90FLAGS) -c $^ -o $@ $(MODULES) -warn all apawgm.o: apawgm.f90 $(MPIF90) $(F90FLAGS) -c $^ -o $@ $(MODULES) -warn all kgec.o: qevars.mod qe_p_psi.mod apawgm.mod kgecvars.mod kgsigma1.mod \ kgsigma2.mod parallel.mod kgecchecks.mod kgecpaw.mod \ kgecgradient.mod kgecout.mod kgec.f90 $(MPIF90) $(F90FLAGS) -c $^ -o $@ $(MODULES) -warn all kgecout.mod : kgecout.f90 kgecout.o kgecgradient.mod : kgecgradient.f90 kgecgradient.o @true kgecpaw.mod : kgecpaw.f90 kgecpaw.o @true kgecchecks.mod : kgecchecks.f90 kgecchecks.o @true parallel.mod : parallel.f90 parallel.o @true kgecvars.mod : kgecvars.f90 kgecvars.o @true kgsigma1.mod : kgsigma1.f90 kgsigma1.o @true kgsigma2.mod : kgsigma2.f90 kgsigma2.o @true qevars.mod : qevars.f90 qevars.o @true apawgm.mod : apawgm.f90 apawgm.o @true qe_p_psi.o : qe_p_psi.f90 $(MPIF90) $(F90FLAGS) -c $^ -o $@ $(MODULES) -warn all qe_p_psi.mod : qe_p_psi.f90 qe_p_psi.o @true kgec.x : kgec.o qevars.o apawgm.o qe_p_psi.o kgecvars.o kgsigma1.o \ kgsigma2.o parallel.o kgecchecks.o kgecpaw.o kgecgradient.o \ kgecout.o $(LD) $(LDFLAGS) -o $@ $^ $(MODULES) \ $(PPOBJS) $(QELIBS) $(LIBOBJS) $(LIBS) (cd ../) clean : - /bin/rm -f *.x *.o *~ *.F90 *.d *.mod *.i work.pc
问题原因及解决方法
原因分析
错误看似由cp命令触发,但子Makefile中并未使用该命令,问题根源在于Windows与Linux的shell语法兼容性差异:
- 主Makefile中的
cp是Linux/Unix命令,Windows PowerShell中的cp是Copy-Item的别名,参数逻辑与GNUcp不一致。 - 主Makefile用括号
()包裹整个命令串,在PowerShell中,括号的命令分组逻辑与bash不同,导致命令被错误拆分,后续的$(MAKE) ... kgec.x被误关联到前面的cp命令,被当作cp的目标参数。
解决步骤
方法1:使用bash环境执行(推荐)
在Windows下安装Git Bash或WSL,切换到bash环境后执行make命令,完全兼容Linux风格的cp和shell语法,无需修改代码。
方法2:修改主Makefile适配PowerShell
- 去掉命令外的括号
(),用&&串联命令,保证前序命令成功后再执行后续:
all : cp -r ./src $(SRCDIR) && cp makefiles/Makefile.for-qe-$(QEV) $(SRCDIR) && \ cd $(SRCDIR) && pwd && $(MAKE) -f Makefile.for-qe-$(QEV) kgec.x || exit 1
- 若PowerShell的
cp仍有问题,可替换为PowerShell原生命令Copy-Item:
将cp -r ./src $(SRCDIR)改为Copy-Item -Recurse ./src $(SRCDIR),注意路径格式需符合Windows规范。
方法3:清理子Makefile冗余命令
子Makefile中kgec.x规则最后一行的(cd ../)是多余的,且在Windows下可能引发目录切换异常,建议直接删除该行。
内容的提问来源于stack exchange,提问作者R Walser
相关产品推荐
相关产品推荐

