GNU Make 4.1的使用

GNU Make 4.1的使用

这是一篇学习笔记,记录萌新在自己笔记本上新装的Ubuntu18.04上尝试使用Makefile的过程,首先给出版本如下:

GNU Make 4.1
为 x86_64-pc-linux-gnu 编译
Copyright (C) 1988-2014 Free Software Foundation, Inc.
许可证:GPLv3+:GNU 通用公共许可证第 3 版或更新版本。
本软件是自由软件:您可以自由修改和重新发布它。
在法律允许的范围内没有其他保证。

本文部分参考了如下博客,关于编译和链接的知识可以参考此处
http://blog.csdn.net/haoel/article/details/2886
https://blog.csdn.net/weixin_38391755/article/details/80380786

由于我们是进行计算流体相关的数值计算的code,Fortran的代码基础比较多,所以这个学习主要是针对Fortran的。好在C、C++、Fortran编译好的文件都是.o文件,并无太大不同。

Makefile是帮助我们编译和链接由多个文件组成的大型程序。在Makefile本身已经写好以后,只需要make,就可以实现编译生成a.out可执行文件。

首先我们有如下的Fortran的code

af3.out00          data             filtry.f             initia.f    rhs.f
af3.out001-std     dfp42para.f      filtrz.f             lrmtx.f     tor3dkp.f
af3.out00r1200-31  dim.h            fnewRHSpljmain.f     Makefile    visrhs.f
bc.f               eigenv.f         fnewRHSsppjplmain.f  n73         w3dp.f
common.h           filtrx-plj.f     geo3d.f              pert-mpi.f  xymets.f
cylin3             filtrx-sppjpl.f  gnupsi               readme

其中main函数只有一个,写好的Makefile文件为:

FFLAGS=-O3
FOR=mpif90
OBJ=fnewRHSpljmain.o initia.o bc.o eigenv.o rhs.o visrhs.o filtry.o\
filtrx-plj.o filtrz.o dfp42para.o lrmtx.o geo3d.o xymets.o pert-mpi.o
#libs=-L /opt/intel/Compiler/11.1/064/mkl/lib/em64t -lmkl -lguide -lpthread
a.out: $(OBJ)
        $(FOR) $(FFLAGS) -o a.out $(OBJ) $(libs)
.f.o:
        $(FOR) $(FFLAGS) -c  $*.f
clean:
        rm *.o  work.pc*

其中前几行写好的FFLAGS、FOR、libs和OBJ相当于替换。在注释之后,是当前Makefile可以让make执行的三个命令
对第一个命令:

a.out: $(OBJ)
        $(FOR) $(FFLAGS) -o a.out $(OBJ) $(libs)

第一个$(OBJ)代表所有的依赖的文件,这些.o的目标文件被编译成为a.out文件。而libs给出了一系列外置的库的链接,在当前的新系统下没有支持他的环境,就注释掉了,不起作用。FFLAGS相当于一个编译优化的命令
对第二个命令:

.f.o:
        $(FOR) $(FFLAGS) -c  $*.f

这个命令把所有的.f文件编译成了.o文件。实际上在.o文件不存在时,如果我们使用第一个命令,make会自动检索.o文件是否存在。不存在时,直接编译一个新的出来。
对第三个命令:

clean:
        rm *.o  work.pc*

就是删除所有的.o文件和所有的wor.pc为头几个名称的文件。

直接执行make时,默认会执行a.out这个命令。

你可能感兴趣的:(其他,Makefile)