Makefile 二进制fortran文件在Make下崩溃
我有一个在默认shell下运行的二进制文件 二进制文件在以下情况下运行正常: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 内部制造 环境
./binary input.dat
但是,如果我将其放入make文件中:
SHELL=/bin/bash
runos:
./binary input.dat
代码崩溃了,让我很无助。
以下是我到目前为止测试的内容,包括Make文件和shell中的所有内容:
ulimit-a
:相同
环境排序>变量1
内部制造
环境|排序>变量2
然后使用以下命令在Make中使用额外变量运行二进制文件:
env SHLVL=2 MAKELEVEL=1 MAKEFLAGS=./binary input.dat
strace-o调试二进制输入.dat
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.