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

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

我是一名 Linux 新手,我正在尝试编译名为DL_POLY_经典。我下载了 zip 文件dl_class_1.6.tar.gz并使用命令解压缩它tar xvzf dl_class_1.6.tar.gz。它为我提供了一系列文件夹,其中包含用于程序操作的各种文件,这些文件在程序中进行了描述手动的。这些目录之一称为来源包含许多。F文件等。该手册说,要编译代码,需要获取示例/模板 Makefile 之一并修改其中的路径,以将程序定向make到包含编译器的适当目录。 (这个 DL_POLY_Classic 程序是用 Fortran 编写的,并且必须使用 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)

我将 Makefile 放在来源目录,按照手册的指示。然后当在来源目录下,我输入命令:

make mpich-c2

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

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

所以,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

我不确定这意味着什么。

另一方面,当我在 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 \

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

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

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

答案1

该错误消息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的程序。您可能只需将文件重命名为并将其放置在主源文件夹中。PARSETnew_params.incnew_params.incdl_params.inc

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

相关内容