我需要从包含一些模块的固定和免费文件制作程序。
我在makefile的开头添加了all
指令。
然后我需要编译几个.f90
文件(它们包含几个模块)。
然后我添加了一个规则来编译.f
文件。
当我运行make时,它首先尝试编译.f
文件。
我应该更改/添加什么?
我使用gfortran作为编译器。
Makefile如下所示:
All: exename
Firstf90.o: Firstf90.f90
<tab>gfortran -c $<
Secondf90.o: Second.f90
<tab>gfortran -c $<
%.o: %.f
<tab>gfortran -c $^
exename: *.o
<tab>gfortran -o exename $^
答案 0 :(得分:1)
使用以下行:
exename: *.o
您告诉make
exename
依赖于扩展名为.o
的所有文件。但是在你创建第一个.o
文件之前,没有,这意味着make
认为它完全不依赖于任何内容。
令人讨厌的是,一旦目标文件存在,这个Makefile
就会完全符合您的期望,这使得很难发现它存在任何问题。
尝试这样的事情:
FIXED_SOURCES = $(wildcard *.f)
FREE_SOURCES = $(wildcard *.f90)
FIXED_OBJECTS = $(patsubst %.f,%.o,${FIXED_SOURCES})
FREE_OBJECTS = $(patsubst %.f90,%.o,${FREE_SOURCES})
all : exename
${FIXED_OBJECTS} : %.o : %.f
<tab>gfortran -o $@ -c $^
${FREE_OBJECTS} : %.o : %.f90
<tab>gfortran -o $@ -c $^
exename : ${FIXED_OBJECTS} ${FREE_OBJECTS}
<tab>gfortran -o $@ $^
注意:通常我会在发布之前对其进行测试,但目前我还不能。此外,有人可能会为您提供更简洁的Makefile
。
答案 1 :(得分:0)
当我运行make时,它首先尝试编译f文件。
这是一个问题吗?如果需要以某种方式编译它们,即由于模块,可以将依赖项添加到Makefile
。假设mymod.f90
创建prog.f90
使用的模块。因此,在编译mymod.f90
之前,需要编译prog.f90
。简单:将此行添加到Makefile
:
prog.o : mymod.o
这声明mymod.o
是prog.o
的先决条件,这意味着在编译prog.o
之前,首先检查mymod.o
是否存在并且是最新的。< / p>