Fortran Coder

查看: 6862|回复: 5
打印 上一主题 下一主题

[IDE] Makefile项目管理

[复制链接]

63

帖子

9

主题

0

精华

专家

超凡脱俗

F 币
474 元
贡献
237 点
跳转到指定楼层
楼主
发表于 2018-11-5 23:11:09 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Jackdaw 于 2018-12-16 19:06 编辑

写在前面:
在开发程序的时候,可能程序规模不大或者其他原因,我们想自己写makefile管理项目,那么这个帖子有一个示例。
闲话少说,上代码。

代码:

main.f90


[Fortran] 纯文本查看 复制代码
program main 
        use func_m
        implicit none 
        real(fp):: a(5)
        call sub(a) 
        write(*,*) a
end program main 


fun.f90


[Fortran] 纯文本查看 复制代码
module func_m
        implicit none 
#ifdef DOUBLE_PRECISION
        integer,parameter :: fp = kind(1.0d0)
#else 
        integer,parameter :: fp = kind(1.0)
#endif

        contains 

subroutine sub(a)
        real(fp):: a(:)
        a = 10.0_fp 
end subroutine 
end module 


makefile


[Make] 纯文本查看 复制代码
#!/usr/bin/bash 
SRC = fun.f90 
SRC:= $(SRC) main.f90 
OBJ = $(SRC:.f90=.o)
FC  = gfortran 
FF  = -cpp -O0 -g -fbacktrace 
DF  = -DDOUBLE_PRECISION 
EXE = myPro

ALL : $(OBJ) 
        $(FC) $(FF) $(DF) -o $(EXE)  $(OBJ) 
        
$(OBJ):%.o:%.f90 
        $(FC) $(FF) $(DF) -c $< -o $@
        
.PONHY: clean
clean :        
        rm -rf *.mod *.o $(EXE) 


演示:




Screenshot_2018-11-06_08-47-22.png (80.47 KB, 下载次数: 288)

演示

演示

评分

参与人数 1权杖 +10 F 币 +20 收起 理由
fcode + 10 + 20 很给力!

查看全部评分

分享到:  微信微信
收藏收藏3 点赞点赞1 点踩点踩
天下英雄出我辈,一入江湖岁月催。

鸿图霸业谈笑间,不胜人生一场醉。

178

帖子

15

主题

0

精华

大宗师

F 币
4973 元
贡献
1152 点
沙发
发表于 2018-11-14 10:43:24 | 只看该作者
本帖最后由 liudy02 于 2018-11-14 10:49 编辑

额,不知道楼主这里为何会这么顺利,实际在运用中的话有个问题是
会提示.mod文件找不到,但是事实上是.mod文件和.o文件一起出来的,不知道为啥会这样
所以在实践中用make的话我是这样做的:
所有的mod,每一个mod单独一个文件,文件名和mod名相同,然后需要写一个类似于执行
a.mod : a.f90
               $(FC) -c a.f90
的语句。虽然其实这个语句加上之后make执行时啥也没干,但是不会报错了
楼主你这个我没看懂,是怎么解决这个问题的呢,能给小白科普一下么?

63

帖子

9

主题

0

精华

专家

超凡脱俗

F 币
474 元
贡献
237 点
板凳
 楼主| 发表于 2018-11-18 10:18:59 | 只看该作者
本帖最后由 Jackdaw 于 2018-11-18 10:25 编辑
liudy02 发表于 2018-11-14 10:43
额,不知道楼主这里为何会这么顺利,实际在运用中的话有个问题是
会提示.mod文件找不到,但是事实上是.mod ...

在编译阶段,生成目标文件或者可执行文件,如果用到了module,会同时生成模块描述文件,也就是 nameOfModule.mod 文件

我猜测你那里遇到报错的原因可能是编译顺序的原因,实际上含有module的代码并没有先行编译,导致其他代码在编译时找不到这个文件

推荐的方法有两种,一种像我makefile里写的那样,先写其他含有module的代码,再写使用module的代码,最后再添加一个主程序文件;另外一种就是,直接用 gfortran -o a.out SRC.f90 生成可执行程序

参考链接:GFortran UsageWiKi
天下英雄出我辈,一入江湖岁月催。

鸿图霸业谈笑间,不胜人生一场醉。

80

帖子

26

主题

0

精华

专家

F 币
280 元
贡献
150 点
地板
发表于 2023-8-4 19:38:20 | 只看该作者
liudy02 发表于 2018-11-14 10:43
额,不知道楼主这里为何会这么顺利,实际在运用中的话有个问题是
会提示.mod文件找不到,但是事实上是.mod ...

这样的话,不是每个module都要写一行这种代码?我有几十个module……

80

帖子

26

主题

0

精华

专家

F 币
280 元
贡献
150 点
5#
发表于 2023-8-4 19:39:45 | 只看该作者
Jackdaw 发表于 2018-11-18 10:18
在编译阶段,生成目标文件或者可执行文件,如果用到了module,会同时生成模块描述文件,也就是 nameOfModu ...

“一种像我makefile里写的那样,先写其他含有module的代码,再写使用module的代码,最后再添加一个主程序文件”
您这样处理,具体是在makefile的哪几行体现的呢?我觉得像是2-3行,但又不像。可否指点一下

178

帖子

15

主题

0

精华

大宗师

F 币
4973 元
贡献
1152 点
6#
发表于 2024-1-25 13:16:05 | 只看该作者
静待花开 发表于 2023-8-4 19:38
这样的话,不是每个module都要写一行这种代码?我有几十个module……

用通配符啊……
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-12-25 10:34

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表