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://gnu.org/licenses/gpl.html>。
本软件是自由软件:您可以自由修改和重新发布它。
在法律允许的范围内没有其他保证。
本文部分参考了如下博客,关于编译和链接的知识可以参考此处
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这个命令。