Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用fortran自动生成:文件顺序_Fortran_Automake - Fatal编程技术网

用fortran自动生成:文件顺序

用fortran自动生成:文件顺序,fortran,automake,Fortran,Automake,在尝试使用autotools构建代码时,我遇到了一个小问题。 我的文件结构是: $ tree . |-- configure.ac |-- Makefile.am `-- src |-- constants.f90 |-- environment.f90 |-- init.f90 |-- main.f90 `-- util.f90 (删除了可能不必要的行) 我的Makefile.am是: #SUBDIRS= help bin_PROGRAMS = sc

在尝试使用autotools构建代码时,我遇到了一个小问题。 我的文件结构是:

$ tree 
.
|-- configure.ac
|-- Makefile.am
`-- src
    |-- constants.f90
    |-- environment.f90
    |-- init.f90
    |-- main.f90
    `-- util.f90
(删除了可能不必要的行) 我的Makefile.am是:

#SUBDIRS= help
bin_PROGRAMS = scasr
scasr_SOURCES = \ 
                src/constants.f90  src/environment.f90  src/util.f90 \
                src/init.f90 src/main.f90 
scasr_LDADD = 
EXTRA_DIST= autogen.sh
CLEANFILES =*.mod 
除了main.f90是模块外,问题是src/(*.f90)的。因此,如果我 必须手动编写makefile,我将:

constants.o : constants.f90 
environment.o : environment.f90 
init.o : init.f90 util.o constants.o 
main.o : main.f90 init.o constants.o environment.o 
util.o : util.f90 constants.o 
因此,对于Makefile.am,我必须在 scasr_来源。即 资料来源如下:

scasr_SOURCES = \ 
                src/constants.f90  src/environment.f90  src/util.f90 \
                src/init.f90 src/main.f90 
它编译得很好。 但如果我有:

scasr_SOURCES = src/main.f90 \ 
                src/constants.f90  src/environment.f90  src/util.f90 \
                src/init.f90  
我得到一个错误:

make  all-am
make[1]: Entering directory `/home/rudra/Programs/ScASR/trunk'
gfortran  -g -O2 -c -o src/main.o src/main.f90
src/main.f90:7.4:

use mget_env
    1
Fatal Error: Can't open module file 'mget_env.mod' for reading at (1):
No such file or directory
make[1]: *** [src/main.o] Error 1
有没有办法让make/configure通过 它本身或者我必须遵守严格的秩序(见评论中的答案)

@斯特凡写道:


您可以直接将依赖项输入到
Makefile.am
。因此,只需将手写的Makefile规则(文章中的第三部分代码)放入
Makefile.am
。据我所知,自动依赖跟踪是不可能的。这可能会随着子模块的增加而改变,这些子模块在Fortran 2008中定义,但尚未在任何流行的编译器中实现

OP写道:

根据@Stefan的评论,我在make文件中添加了依赖项,这解决了问题。我已经测试过,源代码的顺序不再重要了。由于互联网上的资料不多,我将完整的程序放在这里:

  • 创建依赖项列表(
    makedepf90
    是一个不错的选择)
  • 只需在scasr_源之后复制粘贴步骤1的输出:
  • scasr\u SOURCES=src/main.f90\src/constants.f90 src/environment.f90 rc/util.f90 src/init.f90 src/constants.o:src/constants.f90 src/environment.f90 src/init.o:src/init.f90 src/util.o src/main.o:src/main.f90 src/init.o src/constants.o src/environment.o src/util.o:src/utilsrc/constants.o

    注意:我还没有测试如果你把它放在makefile的其他地方,它是否会工作。但这是可行的


    严格的订单有什么问题?项目仍在生产中。因此,只需添加文件名和在适当位置添加文件名就大不相同了。您可以直接将依赖项输入到
    Makefile.am
    。因此,只需将手写的Makefile规则(文章中的第三部分代码)放入
    Makefile.am
    。据我所知,自动依赖跟踪是不可能的。这可能会随着子模块的增加而改变,这些子模块在Fortran 2008中定义,但尚未在任何流行的编译器中实现。有人知道当前版本的Automake中是否提供Fortran依赖项跟踪吗?@MaliRemarker:Shor答案是否定的。我已经做了一个替代方案(在linux系统中):
    depend dependen.mk:makedepf90$(kkr_源代码)>dependen.mk@am_uinclude@@am__quote@depend.mk@am_uuquote@
    这里的“kkr”是bin_程序。Linebreak并没有正确地进行,但希望你们能理解。makedepf90在大多数linux发行版中都可用。希望这有帮助
    $ makedepf90 src/*.f90 src/constants.o : src/constants.f90 src/environment.o : src/environment.f90 src/init.o : src/init.f90 src/util.o src/constants.o src/main.o : src/main.f90 src/init.o src/constants.o src/environment.o src/util.o : src/util.f90 src/constants.o