You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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语法兼容性差异:

  1. 主Makefile中的cp是Linux/Unix命令,Windows PowerShell中的cp是Copy-Item的别名,参数逻辑与GNU cp不一致。
  2. 主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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 05:30:50