我有大约39个Fortran F90源文件和35个Fortran 77 Lapack相关文件。我在我的主程序中使用include语句来连接所有这些文件。
我创建了一个带有命令make.bat
的批处理文件ifort "MDL HydroD.F90"
,它编译了我的代码并生成了mdlhydrod.exe
文件。在此过程中,Fortran编译器会创建许多.mod
和.obj
构建文件,这使得难以管理。我想将源文件放在目录Source
下,并将库文件放在目录lapack
中,并在目录Debug
中构建文件。
任何人都可以帮我修改我的make.bat
文件,以便ifort
查看Source
目录并在Debug
目录中构建。
感谢您的帮助。
目前使用make.bat
只有一行命令:
File Name: make.bat
ifort "MDL HydroD.F90"
处理与nmake
一起使用的make文件(不完整):
File Name: make.mak:
#Make File for MDL HydroD
# Compiler options
FC := ifort
VPATH := src
BINDIR := bin
$(BINDIR):
mkdir -p $(BINDIR)
clean:
@rm -rf $(BINDIR)
答案 0 :(得分:1)
因为您使用了一种奇怪的方式来处理您在other question中显示的源文件,所以很难对此进行更改。
对于重演,您可以使用include
语句将所有内容包含在单个源文件中。这对我来说非常不幸,我在那里评论过。如果你有一个源文件,你被迫用一个命令构建它,没有任何精确控制的地方。这不是bash或bat脚本与Makefile的问题。
你可能仍然可以在一些逻辑相似的组中保留一些文件included
,如果你不需要更好的控制,但我认为没有多少理由。
删除包含或至少相关的包含。那你就可以做到
ifort Source/the_source_file1 -c Output/name_of_obj1 -module the_directory_for_modules -I the_directory_for_modules -other_flags
为每个文件。然后最后:
ifort Output/name_of_obj1 Output/name_of_obj2 Output/name_of_obj3 .... -o the_result
在Scons(我会使用)中,它就像这样(在几个虚拟文件上测试)。文件Sconstruct
:
import os
env = Environment(tools=['default','ifort'])
env.Append(ENV = {'PATH' : os.environ['PATH']})
try:
env.Append(ENV = {'LIBRARY_PATH' : os.environ['LIBRARY_PATH']})
except:
pass
env.Append(F90FLAGS='-g -fast') #whatever flags you need
env.Append(FORTRANFLAGS='-g -fast') #whatever flags you need
outdir = "Output/"
srcdir = "Sources/"
lapackdir = "lapack/"
objs = []
for file in os.listdir(srcdir):
objs += env.Object(target=outdir+os.path.splitext(file)[0], source=srcdir+file)
for file in os.listdir(lapackdir):
objs += env.Object(target=outdir+os.path.splitext(file)[0], source=lapackdir+file)
env.Append(FORTRANMODDIR = outdir)
objs = filter(lambda o: str(o)[-4:] != '.mod', objs)
prg = env.Program(target="bin/result.exe", source= objs)
Default(prg)