Makefile 二进制fortran文件在Make下崩溃

Makefile 二进制fortran文件在Make下崩溃,makefile,fortran,Makefile,Fortran,我有一个在默认shell下运行的二进制文件 二进制文件在以下情况下运行正常: ./binary input.dat 但是,如果我将其放入make文件中: SHELL=/bin/bash runos: ./binary input.dat 代码崩溃了,让我很无助。 以下是我到目前为止测试的内容,包括Make文件和shell中的所有内容: ulimit-a:相同 如上所示,将shell设置为bash SHELL和Make中环境变量的差异: 环境排序>变量1 内部制造 环境

我有一个在默认shell下运行的二进制文件

二进制文件在以下情况下运行正常:

./binary input.dat
但是,如果我将其放入make文件中:

 SHELL=/bin/bash

 runos:
      ./binary input.dat
代码崩溃了,让我很无助。 以下是我到目前为止测试的内容,包括Make文件和shell中的所有内容:

  • ulimit-a
    :相同
  • 如上所示,将shell设置为bash
  • SHELL和Make中环境变量的差异:

    
    环境排序>变量1
    

    内部制造

    
    环境|排序>变量2
    

    然后使用以下命令在Make中使用额外变量运行二进制文件:

    
    env SHLVL=2 MAKELEVEL=1 MAKEFLAGS=./binary input.dat
    

  • 外壳和内部构造中的条纹:

    
    strace-o调试二进制输入.dat
    

  • 代码在Make中不断崩溃,并在shell中运行。我已经在考虑为我的测试用例转储Make,只编写shell脚本。但我很想知道有什么不同

    Fortran代码(F77、F90和F95的混合)是使用gfortran-4.4和以下选项编译的:

    FFLAGS= -g -fbacktrace
    
    所以,具体的问题是,我该怎么做才能让这个二进制文件在Debian的make下运行呢

    更新: 我刚刚在CentOS机器(v5.8)上再次测试,Makefile中的代码不会崩溃(GNU Make版本3.81)。 我还测试了我的Debian Wheezy和openSUSE 11.4,这两个版本都是GNU Make版本3.82——它崩溃了! 我用GNU Make 3.81版在Debian Squence上进行了测试,它确实崩溃了。因此,我认为它不依赖于GNU Make版本

    崩溃时出错: 尝试使用“waf”解决“GNU制造” 我想测试已经有一段时间了,所以这里有另一个有趣的观察: 我编写了一个
    wscript
    ,其中包含一个函数:

    import os
    
    def run(ctx):
        os.system('./binary input.dat')
    
    waf运行
    运行

    如果我将
    run
    方法更改为:

    import subprocess as sp
    def run(ctx):
        sp.call('./binary input.dat', shell=True)
    
    二进制文件也按预期工作

    所以,现在我在想
    gnumake
    以一种导致may二进制失败的方式派生出一个新的子shell(尽管在RHEL5.8下Make确实有效)。

    解决方案:从源代码编译Make。。。 阅读了解更多信息

    好吧,在极度绝望之后,我做了我本该做的事,然后把我所有的麻烦都归咎于
    make

    我认为问题是Debian特有的。但我猜CentOS-5.8中的版本是经过修补的版本,尽管它说是v.3.81。
    因此,对于那些想知道我的解决方案的人来说:

    wget http://ftp.gnu.org/gnu/make/make-3.82.tar.gz
    tar xvzf make-3.82.tar.gz
    cd make-3.82
    ./configure
    ./build.sh
     # copy make to the directory with the binary and input and run the local make version
    ./make
    # everything works as expected !!!
    
    我想让我们缩小范围-

    wget http://ftp.gnu.org/gnu/make/make-3.80.tar.gz
    tar xvzf make-3.80.tar.gz
    cd make-3.80
    ./configure
    ./build.sh
     # copy make to the directory with the binary and input and run the local make version
    ./make
    # everything works as expected !!!
    
    是3.81版吗

    wget http://ftp.gnu.org/gnu/make/make-3.81.tar.gz
    tar xvzf make-3.81.tar.gz
    cd make-3.81
    ./configure
    ./build.sh
     # copy make to the directory with the binary and input and run the local make version
    ./make
    # FAIL! Like with the make version in Debian.
    

    因此,我想我在GNU Make v.3.81中遇到了一些非常奇怪的错误

    代码崩溃时没有错误消息?@eriktous,我确实有代码中的错误消息,但我认为它们不相关。当解算器中的迭代次数超过一定次数时,代码崩溃。这个数字是在文件input.dat中定义的。如果我理解正确,它在传统意义上不会真正“崩溃”,但程序在发现没有收敛后会优雅地终止。是这样吗?所以真正的问题是,为什么从shell开始时会有收敛,而不是从make开始。@eriktous,是的,你是对的。我有更多的见解。。。看上面。我想你找错人了。开始寻找代码中的错误,而不是责怪make。如果代码使用DLL或通过getenv()、getarg()等显式访问环境变量,那么代码只关心其shell/环境。您是否从stdin读取?如果以上都没有,那么就开始寻找数组访问越界或类似情况,根据运行时分配内存的方式,这些情况会导致行为发生变化。
    wget http://ftp.gnu.org/gnu/make/make-3.81.tar.gz
    tar xvzf make-3.81.tar.gz
    cd make-3.81
    ./configure
    ./build.sh
     # copy make to the directory with the binary and input and run the local make version
    ./make
    # FAIL! Like with the make version in Debian.