当我尝试从源代码构建程序时,为什么“make”会抱怨缺少规则?

And*_*rew 2 compiling source make mpi

我是 Linux 新手,我正在尝试编译名为DL_POLY_Classic 的科学软件。我下载了 zip 文件dl_class_1.6.tar.gz并使用命令将其压缩tar xvzf dl_class_1.6.tar.gz。它为我提供了一系列文件夹,其中包含用于程序操作的各种文件,这些文件在程序手册中进行了描述。其中一个名为source 的目录包含许多.f文件等。该手册说要编译代码,需要采用示例/模板 Makefile 之一并修改其中的路径以引导make程序到包含编译器的适当目录。(这个 DL_POLY_Classic 程序是用 Fortran [Fortran 90,我相信]编写的,并且必须用它编译。)

根据一位同事的建议,我尝试使用集群上的 Intel Fortran 编译器 (ifort) 编译此代码。我修改了模板 Makefile 中的目标之一;这个目标现在在 Makefile 中有以下文本:

#========== mpich-c2
mpich-c2: dpp
    cp /opt/mpich/ch-p4/include/mpif.h mpif.h
    $(MAKE) LD="/opt/mpich_intel/ch-p4/bin/mpif90 -O3 -o" \
    LDFLAGS="-L/opt/mpich_intel/ch-p4/lib64 -lmpich" \
    TIMER="" \
    FC=/opt/intel_fc_80/bin/ifort \
    FFLAGS="-c " \
    MPICH_F90="/opt/mpich_intel/ch-p4/bin/mpif90" \
    CPFLAGS="-D$(STRESS) -DMPI -P -D'pointer=integer'\
    -I/opt/mpich_intel/ch-p4/include" \
    EX=$(EX) BINROOT=$(BINROOT) $(TYPE)
Run Code Online (Sandbox Code Playgroud)

我按照手册的指示将Makefile 放在目录中。然后在目录中,我键入命令:

make mpich-c2
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下错误消息:

cp /opt/mpich/ch-p4/include/mpif.h mpif.h
make LD="/opt/mpich_intel/ch-p4/bin/mpif90 -O3 -o" \
        LDFLAGS="-L/opt/mpich_intel/ch-p4/lib64 -lmpich" \
        TIMER="" \
        FC=/opt/intel_fc_80/bin/ifort \
        FFLAGS="-c " \
        MPICH_F90="/opt/mpich_intel/ch-p4/bin/mpif90" \
        CPFLAGS="-DSTRESS -DMPI -P -D'pointer=integer'\
        -I/opt/mpich_intel/ch-p4/include" \
        EX=D.X BINROOT=./ 3pt
make[1]: Entering directory `/export/home/myusername/dlc1_16/dl_class_1.6/source'
make[1]: *** No rule to make target `dl_params.inc', needed by `angfrc.o'.  Stop.
make[1]: Leaving directory `/export/home/myusername/dlc1_16/dl_class_1.6/source'
make: *** [mpich-c2] Error 2
Run Code Online (Sandbox Code Playgroud)

所以,make程序告诉我有No rule to make target dl_params.inc, needed by angfrc.o.

我的问题是,软件告诉我什么?可能是说它找不到文件dl_params.inc,还是可能说它找不到文件angfrc.o?或者,是不是说我的 Makefile 中应该有某种命令来创建一个名为dl_params.inc文件?

当我在我的 Makefile 中搜索时(正如我提到的,它本质上正是作者提供的模板,但只是mpich-c2针对我有权访问的特定 Fortran 编译器修改了目标条目中的目录),我只看到这些提及的dl_params.inc

# Declare dependency on parameters file

$(OBJ_ALL): dl_params.inc
$(OBJ_RRR): dl_params.inc
$(OBJ_4PT): dl_params.inc
$(OBJ_RSQ): dl_params.inc
$(OBJ_NEU): dl_params.inc
$(OBJ_RIG): dl_params.inc
$(OBJ_EXT): dl_params.inc
$(OBJ_SPME): dl_params.inc
$(OBJ_HKE): dl_params.inc
Run Code Online (Sandbox Code Playgroud)

我不确定这意味着什么。

另一方面,当我在我的 Makefile 中搜索angfrc.o 时,我只看到一个提及,在下面的第一行(之后OBJ_ALL):

# Define object files

#=====================================================================

OBJ_ALL = angfrc.o bndfrc.o cfgscan.o corshl.o coul0.o coul4.o \
    coul2.o coul3.o conscan.o dblstr.o dcell.o diffsn0.o \
    diffsn1.o dlpoly.o duni.o error.o ewald1.o ewald3.o \
    exclude.o exclude_atom.o fldscan.o exclude_link.o forces.o\
    exitcomms.o extnfld.o fbpfrc.o fcap.o freeze.o gauss.o \
    gdsum.o getrec.o gimax.o gisum.o gstate.o images.o initcomms.o \
    intlist.o intstr.o invert.o invfrc.o jacobi.o lowcase.o lrcmetal.o \
    lrcorrect.o machine.o merge.o merge1.o merge4.o \
    npt_b1.o npt_b3.o parset.o npt_h1.o npt_h3.o nve_1.o \
    nvt_b1.o nvt_e1.o nvt_h1.o parlst_nsq.o parlink.o parlst.o passcon.o \
    passpmf.o pmf_1.o pmf_shake.o primlst.o quench.o rdf0.o rdf1.o \
    rdshake_1.o result.o revive.o scdens.o shellsort.o shlfrc.o \
    shlmerge.o shlqnch.o shmove.o simdef.o splice.o static.o strip.o \
    strucopt.o sysdef.o sysgen.o systemp.o sysbook.o sysinit.o \
    tethfrc.o thbfrc.o timchk.o traject.o vertest.o vscaleg.o \
    warning.o xscale.o zden0.o zden1.o \
Run Code Online (Sandbox Code Playgroud)

我也不确定这意味着什么。

有趣的是,当我使用该find命令按名称进行搜索时——例如find -name angfrc.ofind -name *.o, 和find -name dl_params.inc-- 在具有这些名称的程序目录中的任何地方都找不到任何内容。当我尝试时find -name *.inc,我确实发现目录中存在一个文件comms.inc。这个特定文件在其标题中说它是“用于 MPI、PVM 和 SHMEM 的 dl_poly 包含文件”。这是一个相对较短的文件(只有 42 行长),它似乎同时包含“消息标签参数”和“MPI 标签大小”——尽管我真的不知道我应该寻找什么在那里。

如果你有时间,你能不能给我建议我接下来应该尝试什么?我不太确定错误消息No rule to make target dl_params.inc, needed by angfrc.o.告诉我什么;你有什么想法?非常感谢您的宝贵时间。

Noa*_*oah 6

错误消息No rule to make target dl_params.inc, needed by angfrc.o.意味着,Makefile 将文件指定dl_params.inc为构建文件的依赖项angfrc.o。所以你必须以某种方式找到或创建dl_params.inc文件。

搜索文档表明,该文件应包含 DL_POLY 所需的 FORTRAN 参数。的用户手册中第7.1.1节说明,应该有一个utility包含程序的子文件夹PARSET,可用于产生这样的参数文件(称为new_params.inc默认情况下)。您可能只需要将new_params.inc文件重命名为dl_params.inc并将其放在主源文件夹中。

如果错误仍然存​​在,那么 Makefile 显然需要dl_params.inc其他地方的文件,您必须仔细查看 Makefile。