在linux下如何使用Makefile对fortran程序进行编译

在linux下写过不少的fortran程序,但很少写makefile文件,通常情况下我是手动用ifort或pgf90进行编译,虽然也在大型程序中写过一些代码,但因为都有现成的makefile文件,我也只是修改一下配置参数,先make clean,再make,只要生成可执行程序就算搞定了。今天心血来潮,自己写了几个Makefile,供大家参考。


一、不用Makefile的直接编译
比如有2个简单程序,主程序为main.F90,子程序为sub.F90. 如果直接编译的话,键入
ifort main.F90 sub.F90
就可以生成一个a.out文件,即为可执行程序了。
你也可以指定一个可执行程序的名字,如
ifort main.F90 sub.F90 -o bin.exe
则可以生成bin.exe,实际上与a.out是一样的。
当然,如果你不喜欢用子程序,或者子程序和主程序都写在一个F90文件中(如main.F90),上述的编译语句直接省掉sub.F90就行了,但不推荐这样写程序,特别是程序比较大的情况下,一是程序间的关系容易理不清,另外风险也大,万一哪天把程序删掉了或改错了,损失可就大了。


上面的编译也可以分两步进行,
ifort -c main.F90 sub.F90
ifort -o main.exe main.o sub.o
第一行称为编译compile,第二行称为链接link。这个过程最后还是生成main.exe,第一步生成main.o和sub.o两个目标文件,第二步将目标文件链接成可执行文件main.exe。这看起来有点多此一举,如果在程序不大,子程序不多的情况下,这确实是浪费体力,但如果有几十或几百个子程序(如WRF模式),编译一次可能要花几十分钟或几个小时,那么可以单独编译修改的那个程序生成相应的.o文件就行了,然后再执行第二步链接,这样可以节省不少时间。也就是说,第一步的编译可以分开进行:
ifort -c main.F90
ifort -c sub.F90
在有几个子程序的情况下,这样分开编译虽然花点工夫,还是值得的,因为程序很难一蹴而就,总要调试,总要修改,分解成若干子程序逐个编译更容易各个击破。


二、简单的Makefile文件
我们仍以一行编译语句为例,将其写在Makefiel文件中。使用vi建立一个新的Makefile文件,在其中写入:
main.exe: main.F90 sub.F90
ifort main.F90 sub.F90 -o main.exe
就可以了。你把已有的main.exe删掉,键入make,你会发现生成了新的main.exe. 这就是Makefile文件了,简单吧!
如果报错的话,你看看是不是Makefile中的第二行之前没有用tab键空格,必须用tab键,用空格键是不行嘀。


下面我们再来解释一下Makefile的写作格式
简而言之,Makefile的格式就是二行,第一行定义目标文件和依赖文件,:之前的main.exe为目标文件,:之前后的main.F90和sub.F90为依赖文件。第二行为执行语句,与手动编译相同。好像第一行还是多此一举,还不如手动编译只要一行就搞定,我们看完下一个例子再来讨论这一点。


那么对于编译和链接分解的语句如何写呢。重新打开Makefile文件,将原来的两行删去,再写入:
main.exe:main.o sub.o
ifort -o main.exe main.o sub.o
main.o:main.F90
ifort -c main.F90
sub.o:sub.F90
ifort -c sub.F90
这就可以了,是不是还发现一点异样?语句的顺序和前面手动编译时是反的,先是链接语句,后是编译语句,这一点我们稍后解释。还是先运行一下吧,将原来的.exe和.o文件都删掉,执行make后,是不是可以看到新生成了.o和.exe文件。你还可以试试将其中的main.F90进行修改(比如加一行空格,或加一条注释),再执行make,可以发现,仅更新了main.o和main.exe,而sub.o还是原来的生成时间。这就是make的优势。


我们先来解释一下目标文件和依赖文件的关系,如果任意一个依赖文件发生了改变,则要运行下一行的执行语句,即生成新的目标文件,否则跳过执行文件。在make执行的过程中,实际上并不是顺序执行的,而是先把所有的目标文件和依赖文件检查一遍,从最顶层的目标文件开始,再分解检查各个子目标,将发生变化的依赖文件标记下来,然后再从下向上执行标记语句,最后更新顶层的目标文件。所以写makefile文件的顺序必须是先写顶层的目标文件,也就是连接生成的.exe文件,然后再分别写编译要生成的.o文件,这与手动编译时是不同的。make的工作方式就象警察办案一样,先侦察推演,收集证据;再顺藤摸瓜,收网抓贼。


三、复杂一点的Makefile文件
下面这个例子中用到了变量定义和静态模式
SOURS = main.F90 sub.F90
OBJS = main.o sub.o
BIN = main.exe
F90 = ifort


${BIN}:${OBJS}
${F90} -o ${BIN} ${OBJS}
${OBJS}: %.o :%.F90
${F90} -c $<
先来说说变量定义,这个地球人都知道,只要会写shell脚本的人都能看的懂,如果子程序不多的话也没必要定义来定义去的。


http://www.zhixing123.cn/ubuntu/30488.html

  • 8
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Make命令   在make命令后不仅可以出现宏定义,还可以跟其他命令行参数,这些参数指定了需要编译的目标文件。其标准形式为:   target1 [target2 …]:[:][dependent1 …][;commands][#…]   [(tab) commands][#…]   方括号中间的部分表示可选项。Targets和dependents当中可以包含字符、数字、句点和"/"符号。除了引用,commands中不能含有"#",也不允许换行。   在通常的情况下命令行参数中只含有一个冒号":",此时command序列通常和makefile文件中某些定义文件间依赖关系的描述行有关。如果与目标相关连的那些描述行指定了相关的command序列,那么就执行这些相关的command命令,即使在分号和(tab)后面的aommand字段甚至有可能是NULL。如果那些与目标相关连的行没有指定command,那么将调用系统默认的目标文件生成规则。   如果命令行参数中含有两个冒号"::",则此时的command序列也许会和makefile中所有描述文件依赖关系的行有关。此时将执行那些与目标相关连的描述行所指向的相关命令。同时还将执行build-in规则。   如果在执行command命令时返回了一个非"0"的出错信号,例如makefile文件中出现了错误的目标文件名或者出现了以连字符打头的命令字符串,make操作一般会就此终止,但如果make后带有"-i"参数,则make将忽略此类出错信号。   Make命本身可带有四种参数:标志、宏定义、描述文件名和目标文件名。其标准形式为:   Make [flags] [macro definitions] [targets]   Unix系统下标志位flags选项及其含义为:   -f file  指定file文件为描述文件,如果file参数为"-"符,那么描述文件指向标准输入。如果没有"-f"参数,则系统将默认当前目录下名为makefile或者名为Makefile的文件为描述文件。在linux中, GNU make 工具在当前工作目录中按照GNUmakefilemakefileMakefile的顺序搜索 makefile文件。   -i   忽略命令执行返回的出错信息。   -s   沉默模式,在执行之前不输出相应的命令行信息。   -r   禁止使用build-in规则。   -n   非执行模式,输出所有执行命令,但并不执行。   -t   更新目标文件。   -q   make操作将根据目标文件是否已经更新返回"0"或非"0"的状态信息。   -p   输出所有宏定义和目标文件描述。   -d   Debug模式,输出有关文件和检测时间的详细信息。   linuxmake标志位的常用选项与Unix系统中稍有不同,下面我们只列出了不同部分:   -c dir   在读取 makefile 之前改变到指定的目录dir。   -I dir   当包含其他 makefile文件时,利用该选项指定搜索目录。   -h   help文挡,显示所有的make选项。   -w   在处理 makefile 之前和之后,都显示工作目录。   通过命令行参数中的target ,可指定make编译的目标,并且允许同时定义编译多个目标,操作时按照从左向右的顺序依次编译target选项中指定的目标文件。如果命令行中没有指定目标,则系统默认target指向描述文件中第一个目标文件。
第一部分、概述...............................................................................................................................6 第二部分、关于程序编译和链接...............................................................................................6 第三部分、 Makefile 介绍 ............................................................................................................7 一、 Makefile的规则 ..............................................................................................................7 二、一个示例...........................................................................................................................8 三、 make是如何工作的........................................................................................................9 四、 makefile使用变量....................................................................................................10 五、让make自动推导..........................................................................................................11 六、另类风格的makefile....................................................................................................12 七、清空目标文件的规则.....................................................................................................13 第四部分、 Makefile 总述 ..........................................................................................................13 一、 Makefile里有什么? ....................................................................................................13 1、显式规则。 ..............................................................................................................14 2、隐晦规则。 ..............................................................................................................14 3、变量的定义。 ..........................................................................................................14 4、文件指示。 ..............................................................................................................14 5、注释。 ......................................................................................................................14 二、 Makefile的文件名 ........................................................................................................15 三、引用其它的Makefile ....................................................................................................15 四、环境变量 MAKEFILES................................................................................................16 五、 make的工作方式..........................................................................................................16 第五部分、书写规则.....................................................................................................................17 一、规则举例.........................................................................................................................17 二、规则的语法.....................................................................................................................17 三、在规则中使用通配符.....................................................................................................18 四、文件搜寻.........................................................................................................................19 五、伪目标.............................................................................................................................20 六、多目标.............................................................................................................................22 七、静态模式.........................................................................................................................22 八、自动生成依赖性.............................................................................................................24 第六部分 书写命令.......................................................................................................................25 一、显示命令.........................................................................................................................26 二、命令执行.........................................................................................................................26 三、命令出错.........................................................................................................................27 四、嵌套执行make..............................................................................................................28 五、定义命令包.....................................................................................................................30 第七部分 使用变量.......................................................................................................................30 一、变量的基础.....................................................................................................................31 二、变量中的变量.................................................................................................................32 三、变量高级用法.................................................................................................................34 四、追加变量值.....................................................................................................................37 五、 override 指示符 ..........................................................................................................37 六、多行变量.........................................................................................................................38 第 2 页共 78 页 2005 年 10 月 14 日整理:祝冬华跟我一起写 Makefile 作者:陈皓 七、环境变量.........................................................................................................................38 八、目标变量.........................................................................................................................39 九、模式变量.........................................................................................................................40 第八部分 使用条件判断...............................................................................................................40 一、示例.................................................................................................................................40 二、语法.................................................................................................................................42 第九部分 使用函数.......................................................................................................................43 一、函数的调用语法.............................................................................................................44 二、字符串处理函数.............................................................................................................44 1、 subst .......................................................................................................................44 2、 patsubst.................................................................................................................45 3、 strip .........................................................................................................................45 4、 findstring ...............................................................................................................46 5、 filter.........................................................................................................................46 6、 filter-out.................................................................................................................46 7、 sort ..........................................................................................................................47 8、 word ........................................................................................................................47 9、 wordlist ..................................................................................................................47 10、 words....................................................................................................................47 11、 firstword..............................................................................................................48 12、字符串函数实例....................................................................................................48 三、文件名操作函数.............................................................................................................48 1、 dir.............................................................................................................................48 2、 notdir ......................................................................................................................48 3、 suffix .......................................................................................................................49 4、 basename..............................................................................................................49 5、 addsuffix................................................................................................................49 6、 addprefix ...............................................................................................................49 7、 join...........................................................................................................................50 四、 foreach 函数................................................................................................................50 五、 if 函数 ............................................................................................................................50 六、 call函数..........................................................................................................................51 七、 origin函数 .....................................................................................................................51 “undefined” .................................................................................................................52 “default”.......................................................................................................................52 “file”...............................................................................................................................52 “command line”.........................................................................................................52 “override” ....................................................................................................................52 “automatic”.................................................................................................................52 八、 shell函数 .......................................................................................................................53 九、控制make的函数..........................................................................................................53 1、 error ........................................................................................................................53 2、 warning ..................................................................................................................54 第十部分 make 的运行..............................................................................................................54 第 3 页共 78 页 2005 年 10 月 14 日整理:祝冬华跟我一起写 Makefile 作者:陈皓 一、 make的退出码..............................................................................................................54 二、指定Makefile ................................................................................................................54 三、指定目标.........................................................................................................................55 “all” ................................................................................................................................56 “clean” ..........................................................................................................................56 “install” .........................................................................................................................56 “print” ...........................................................................................................................56 “tar” ...............................................................................................................................56 “dist”..............................................................................................................................56 “TAGS” ..........................................................................................................................56 “check”和“test” ..........................................................................................................56 四、检查规则.........................................................................................................................57 五、 make的参数..................................................................................................................57 第十一部分 隐含规则...................................................................................................................61 一、使用隐含规则.................................................................................................................61 二、隐含规则一览.................................................................................................................62 1、编译C程序的隐含规则 ...........................................................................................63 2、编译C++程序的隐含规则.....................................................................................63 3、编译Pascal程序的隐含规则..................................................................................63 4、编译Fortran/Ratfor程序的隐含规则..................................................................63 5、预处理Fortran/Ratfor程序的隐含规则..............................................................63 6、编译Modula-2 程序的隐含规则...........................................................................63 7、汇编和汇编预处理的隐含规则 ..............................................................................64 8、链接Object文件的隐含规则 .................................................................................64 9、 Yacc C程序时的隐含规则 .....................................................................................64 10、 Lex C程序时的隐含规则.....................................................................................64 11、 Lex Ratfor程序时的隐含规则 ...........................................................................65 12、从C程序、 Yacc文件或Lex文件创建Lint库的隐含规则 ..................................65 三、隐含规则使用的变量.....................................................................................................65 1、关于命令的变量。 ..................................................................................................65 2、关于命令参数的变量 ..............................................................................................66 四、隐含规则链.....................................................................................................................67 五、定义模式规则.................................................................................................................68 1、模式规则介绍 ..........................................................................................................68 2、模式规则示例 ..........................................................................................................69 3、自动化变量 ..............................................................................................................70 4、模式的匹配 ..............................................................................................................72 5、重载内建隐含规则 ..................................................................................................72 六、老式风格的"后缀规则" .................................................................................................73 七、隐含规则搜索算法.........................................................................................................74 第十二部分 使用make更新函数库文件....................................................................................75 一、函数库文件的成员.........................................................................................................75 二、函数库成员的隐含规则.................................................................................................75 三、函数库文件的后缀规则.................................................................................................76 第 4 页共 78 页 2005 年 10 月 14 日整理:祝冬华跟我一起写 Makefile 作者:陈皓 四、注意事项.........................................................................................................................76 第十三部分 后序...........................................................................................................................77
### 回答1: 要使用CLion编译Fortran程序为可执行文件,需要按照以下步骤进行操作: 1. 安装Fortran编译器:确保在计算机中安装了Fortran编译器。在Windows上,可以安装MinGW-w64或者Gfortran。在macOS上,可以安装GNU Compiler Collection (GCC)或者Gfortran。在Linux上,可以使用系统包管理器安装相应的Fortran编译器。 2. 在CLion中创建新的Fortran项目:打开CLion,并选择“Create New Project” (创建新项目)。在弹出的对话框中,选择“Fortran Executable” (Fortran可执行文件)作为项目类型,并按照提示完成项目的设置。 3. 配置CMakeLists.txt文件:在CLion的项目面板中,打开CMakeLists.txt文件。在文件中添加以下内容来设置Fortran编译器的路径: ``` set(CMAKE_Fortran_COMPILER <path_to_fortran_compiler>) ``` 在`<path_to_fortran_compiler>`处替换为你安装的Fortran编译器的路径。 4. 添加Fortran源文件:将你的Fortran源文件添加到CLion的源码目录中。可以使用CLion的“Add Files to Directory”来添加文件。 5. 构建项目:在CLion的菜单栏中,选择“Build”(构建)选项,然后点击“Build Project”(构建项目)。CLion将使用CMake来生成Makefile,并通过Fortran编译器来编译源文件。 6. 运行可执行文件:构建成功后,CLion会在项目的构建目录中生成可执行文件。你可以通过在CLion中点击绿色的“Run”按钮或者在命令行中执行该可执行文件来运行你的Fortran程序。 请注意,以上步骤假设你已经正确安装了Fortran编译器并且已经将其配置到了系统的环境变量中。如果安装和配置过程中出现问题,请参考相关的文档或者联系Fortran编译器供应商的支持团队。 ### 回答2: 要使用CLion编译Fortran程序为可执行文件(exe),您可以按照以下步骤进行操作: 1. 确保您的CLion已经安装并且成功运行。CLion是一个支持多种编程语言的集成开发环境(IDE),但是默认情况下不支持Fortran语言。 2. 安装Fortran插件:在CLion的插件市场中搜索并安装Fortran插件。Fortran插件为CLion添加了对Fortran语言的支持和集成。 3. 创建一个新的Fortran项目:在CLion中,选择“File”(文件)-> “New C/C++/Fortran Project”(新建C/C++/Fortran项目)菜单选项,然后选择“Fortran Executable”(Fortran可执行文件)项目类型。根据需要选择新项目的名称、路径和其他设置。 4. 添加Fortran源文件:在项目面板中,右键单击“Source Files”(源文件)目录,并选择“New”(新建)-> “Fortran File”(Fortran文件)。选择Fortran源文件的名称,并开始编写您的Fortran代码。 5. 定义编译器:在CLion的设置中,找到“Build, Execution, Deployment”(构建、执行、部署)-> “Toolchains”(工具链)菜单选项,并添加Fortran编译器。您可以选择已经安装的编译器或者手动指定编译器的路径。 6. 设置构建配置:在工具栏中选择正确的构建配置(比如Debug模式或Release模式),然后点击“Build”(构建)按钮。CLion会使用您添加的编译器来构建Fortran项目,并生成可执行文件。 7. 运行程序:构建成功后,您可以选择“Run”(运行)按钮或使用快捷键来运行生成的可执行文件。 使用以上步骤,您可以在CLion中编译和运行Fortran程序,生成可执行文件(exe)。 ### 回答3: CLion是一个强大的集成开发环境(IDE),用于开发C和C++应用程序。它默认支持这两种语言以及其他一些编程语言。然而,CLion并不直接支持Fortran语言的编译和执行。Fortran是一种用于科学和工程计算的编程语言,通常用于数值计算和高性能计算。 要在CLion中编译Fortran代码并创建可执行文件(.exe),需要安装并配置与Fortran编译器兼容的构建工具链。下面是一些可以实现此目的的步骤: 1. 下载和安装一个Fortran编译器,如GNU Fortran或Intel Fortran。这些编译器提供了将Fortran代码编译为可执行文件的工具。 2. 在CLion中创建一个新的C++项目。对于Fortran代码,我们可以使用C++项目,因为它们之间有类似的构建设置和配置。 3. 在项目设置中,将构建类型设置为CMake。CMake是一个跨平台的构建系统,可以与CLion集成。 4. 打开CMakeLists.txt文件,并在其中添加Fortran代码文件的路径。例如,如果Fortran代码文件名为main.f90,可以将以下行添加到CMakeLists.txt文件中: ``` add_executable(my_program main.f90) ``` 5. 配置CMake生成的构建过程以包含Fortran编译器。在CMakeLists.txt文件中,使用SET命令将Fortran编译器设置为C编译器。例如,使用GNU Fortran编译器,可以使用以下命令: ``` set(CMAKE_Fortran_COMPILER gfortran) ``` 6. 在CLion中构建项目。选择构建选项或按下相关的快捷键,以开始构建过程。 7. 构建完成后,可执行文件(.exe)将生成在工作目录中。 请注意,这只是一种可能的方法,具体步骤可能因操作系统和具体需求而有所不同。同样,可能需要配置路径和环境变量,以确保CLion可以找到所需的构建工具链和库。搜索Fortran编译器和CMake配置Fortran的相关文档和教程可能会对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值