Makefile:避免为新文件夹编译Fortran模块

3
我有一个Fortran程序,使用了模块,即编译时会创建“.mod”文件。 我还编写了一个Makefile,它使用“src/”中的所有“.f90”文件,将所有创建的“.o”文件放在“obj/”中,并将二进制文件放在当前文件夹中,一切都运行良好。
现在我需要在不同的文件夹(例如“calc1/”)中对程序进行重新编译。我将Makefile复制到“calc1/”中,然后在“calc1/”中键入“make all”,所有它所做的就是链接,因为目标文件已经存在。但是,如果程序包括任何模块,则编译器需要相应的“.mod”文件存在于“calc1/”中。直到现在,我一直重新编译所有内容(“make clean all”),但随着程序的增长,这需要太多时间!
我想到的一个可能的解决方案是为二进制文件(“bin/”)单独指定一个特定的文件夹。但这不是可行的选择,因为我有排队的作业,显然需要稳定的二进制文件,而与此同时,我也尝试新功能。
因此,我正在寻找一种解决方案,可以将“.mod”文件与“.o”文件类似地处理,例如将它们放在“obj/”中。

我知道Make,但我不知道Fortran(哈!)。编译器是否在当前目录中构建mod文件?它们是否有可预测的名称(例如 foo.f90 => foo.mod)?您是否可以通过编译器参数控制它们的名称? - Beta
正确的,mod文件会在当前目录中创建,并按照文件中给定的名称命名,例如,如果foo.f90包含module bar,则该文件将被命名为bar.mod。在编译过程中无法控制此名称,因为该名称在其他文件中使用,即在main.f90中我写use bar - Jost
1个回答

5

我认为大多数编译器都会提供一个选项来更改模块文件路径。对于gfortran,该选项是-J-M(来自man页面):

-Jdir
-Mdir
       This option specifies where to put .mod files for compiled modules.  It is also
       added to the list of directories to searched by an "USE" statement.

       The default is the current directory.

       -M is deprecated to avoid conflicts with existing GCC options.

我认为大多数编译器会在包含-I的目录中查找.mod文件。 编辑 从gfortran 4.6开始,不再支持-M。请使用-J
基于我的一个配置脚本,对于ifortpgf90编译器,该标志是-module,尽管我现在几乎不再使用这些编译器,所以需要其他人确认...

确认。这是 ifort-module 模块。感谢您的帮助! - Jost

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接