编译构建总结

Author Avatar
Damon Lee 4月 06, 2019
  • 在其它设备中阅读本文章

前言

​ 最近一个月都在忙气象模型相关的应用,例如mm5,WRF,CMAQ等,因为需要在天河超算上运行,普通用户又没有sudo权限,所以就只能自己动手编译了。这些应用都是开源的,且大多采用Fortain语言编写,折腾了一段时间自然要记录一下。

概念介绍

make (说白了就是一个编译命令)

软件开发中,make是一个工具程序(Utility software),经由读取叫做“makefile”的文件,自动化建构软件。它是一种转化文件形式的工具,转换的目标称为“target”;与此同时,它也检查文件的依赖关系,如果需要的话,它会调用一些外部软件来完成任务。它的依赖关系检查系统非常简单,主要根据依赖文件的修改时间进行判断。大多数情况下,它被用来编译源代码,生成结果代码,然后把结果代码连接起来生成可执行文件或者库文件。它使用叫做“makefile”的文件来确定一个target文件的依赖关系,然后把生成这个target的相关命令传给shell去执行。

Makefile (说白了就是编译的配置文件)

一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令

(说白了就是编译环境的环境变量)

“宏”指的是用一个字符串代替另一个字符串的功能。在makefile中可以使用“=”号来定义宏,使用“$(宏名)”来使用宏;还可以用“+=”追加宏的内容。习惯上,宏名使用大写。例如CC、CXX、FC、FCFLAGS等。

宏基本上在你做编译和移植主要修改的参数,因为大部分应用都把这里处理的很不错。

一般我们可以通过环境变量设置,或者在执行./configure命令后跟上相应的配置,例如下面的命令:

1
./configure CC=icc FC=ifort		#将CC和FC的编译命令指定为icc和ifort

编译器介绍

网上的教程大多采用GNU的gcc和g++以及gfortran等,也有少部分资料采用intel的编译器,intel的编译器经过我的测试要比GNU系列的编译速度快,并且基本上每年每个季度都会更新,当然也是收费的,不过学生和开源项目的参与者可以免费获取一年的license,具体步骤我就不在这里叙述了,网上有很多资料。

下表是GNU和INTEL的命令对照,设计到MPI的部分这里不做介绍

GNU INTEL
gcc icc
g++ icpc
gfortran ifort