我有一个在我的默认shell下运行的二进制文件。
二进制文件完美运行o.k.用:
./binary input.dat
但是,如果我把它放在一个make文件中:
SHELL=/bin/bash
runos:
./binary input.dat
代码崩溃,让我很无奈。 这是我到目前为止测试的内容,Make文件和shell中的所有内容:
ulimit -a
:相同。SHELL中环境变量的差异和Make with:
env | sort > vars.1
内部制作
env | sort > vars.2
然后使用以下命令在Make中运行带有额外变量的二进制文件:
env SHLVL=2 MAKELEVEL=1 MAKEFLAGS= ./binary input.dat
在shell和里面做strace:
strace -o debug binary input.dat
代码在Make中继续崩溃,并在shell中运行。我已经在考虑为我的测试用例转储Make并编写shell脚本。但我很想知道有什么区别。
使用gfortran-4.4和以下选项编译Fortran代码(F77,F90和F95的混合代码):
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 Squeeze上测试,它确实崩溃了。所以,我认为它不依赖于GNU Make版本。
崩溃时出现 enter timeloop
------------------------------------------------------------------------
timestep: 1 time: 2.500E-02 days delt: 2.500E-02 days
-------------------------------------------
terminated in routine react_snia
maximum number of iterations exceeded
bye now ...
-------------------------------------------
failure in timeloop
no further time step reduction possible
try reducing min. time step, bye now ...
我想测试waf已经有一段时间了,所以这是另一个有趣的观察:
我写了一个wscript
,其中包含一个函数:
import os
def run(ctx):
os.system('./binary input.dat')
waf run
正在运行!
如果我将run
方法更改为:
import subprocess as sp
def run(ctx):
sp.call('./binary input.dat', shell=True)
二进制文件按预期工作。
所以,现在我想GNU Make
以一种导致二进制失败的方式分叉一个新的子shell(虽然在RHEL 5.8 Make下工作)。
答案 0 :(得分:0)
阅读以了解更多信息。
好的,所以在非常绝望之后,我做了我应该做的事情,然后责怪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中碰到了一些非常奇怪的错误。