如何在Windows7中编译NetHack?

如何在Windows7中编译NetHack?,c,windows-7,compiler-errors,mingw,nethack,C,Windows 7,Compiler Errors,Mingw,Nethack,我喜欢NetHack,我想和源代码玩一玩。 在我这么做之前,我希望能够让它开箱即用地编译,但要做到这一点,我有不少困难 我从下载了源代码,并按照说明进行操作,但它不起作用 我最终得到了以下结果 C:\nethack-3.4.3\src>mingw32-make -f Makefile.gcc install creating directory o gcc -c -mms-bitfields -I../include -g -DWIN32CON -oo/makedefs.o ../uti

我喜欢NetHack,我想和源代码玩一玩。 在我这么做之前,我希望能够让它开箱即用地编译,但要做到这一点,我有不少困难

我从下载了源代码,并按照说明进行操作,但它不起作用

我最终得到了以下结果

C:\nethack-3.4.3\src>mingw32-make -f Makefile.gcc install
creating directory o
gcc -c -mms-bitfields -I../include  -g -DWIN32CON -oo/makedefs.o ../util/makedefs.c
gcc -c -mms-bitfields -I../include  -g -DWIN32CON -DDLB   -oo/monst.o  ../src/monst.c
gcc -c -mms-bitfields -I../include  -g -DWIN32CON -DDLB   -oo/objects.o      ../src/objects.c
..\util\makedefs -v
Makefile.gcc:655: recipe for target '../include/date.h' failed
mingw32-make: *** [../include/date.h] Error -1073741819
我看了看它说的那条线,但它没有告诉我任何事情。我注意到在include目录中创建的date.h文件总是空的,但这对我也没有多大帮助。我读了Install.nt自述文件,说明似乎很清楚。然而,由于我没有改变任何东西,我不知道为什么它会无法编译

<>我认为自己是一个称职的程序员,但在制作文件和编译C代码到一个可执行的应用程序时,我几乎一无所知,所以我在这里非常迷茫。我下载并安装了MinGW。。。一切,我的意思是,当我运行MinGW安装程序时,没有任何东西被卸载

我做错了什么

编辑:提到日期h时:

#
#  date.h should be remade every time any of the source or include
#  files is modified.
#

$(INCL)/date.h $(OPTIONS_FILE): $(U)makedefs.exe
    $(subst /,\,$(U)makedefs -v)
我确实注意到它似乎在调用
OPTIONS\u FILE
,这似乎被注释掉了。我将取消它的注释,看看会发生什么

#$(OPTIONS_FILE): $(U)makedefs.exe
#$(subst /,\,$(U)makedefs -v)
编辑不起作用的2。是否可能需要手动创建/更新date.h文件?如果是,我应该在里面放些什么?听起来像是谷歌的一个问题

编辑3我找到了一个旧得多的版本,并试图对其进行修改,但也没有成功

编辑4有人提到这似乎是一件令人崩溃的事情。我找到了导致问题的C函数:

void
do_date()
{
    long clocktim = 0;
    char *c, cbuf[60], buf[BUFSZ];
    const char *ul_sfx;

    filename[0]='\0';
#ifdef FILE_PREFIX
    Strcat(filename,file_prefix);
#endif
    Sprintf(eos(filename), INCLUDE_TEMPLATE, DATE_FILE);
    if (!(ofp = fopen(filename, WRTMODE))) {
        perror(filename);
        exit(EXIT_FAILURE);
    }
    Fprintf(ofp,"/*\tSCCS Id: @(#)date.h\t3.4\t2002/02/03 */\n\n");
    Fprintf(ofp,Dont_Edit_Code);

#ifdef KR1ED
    (void) time(&clocktim);
    Strcpy(cbuf, ctime(&clocktim));
#else
    (void) time((time_t *)&clocktim);
    Strcpy(cbuf, ctime((time_t *)&clocktim));
#endif
    for (c = cbuf; *c; c++) if (*c == '\n') break;
    *c = '\0';  /* strip off the '\n' */
    Fprintf(ofp,"#define BUILD_DATE \"%s\"\n", cbuf);
    Fprintf(ofp,"#define BUILD_TIME (%ldL)\n", clocktim);
    Fprintf(ofp,"\n");
#ifdef NHSTDC
    ul_sfx = "UL";
#else
    ul_sfx = "L";
#endif
    Fprintf(ofp,"#define VERSION_NUMBER 0x%08lx%s\n",
        version.incarnation, ul_sfx);
    Fprintf(ofp,"#define VERSION_FEATURES 0x%08lx%s\n",
        version.feature_set, ul_sfx);
#ifdef IGNORED_FEATURES
    Fprintf(ofp,"#define IGNORED_FEATURES 0x%08lx%s\n",
        (unsigned long) IGNORED_FEATURES, ul_sfx);
#endif
    Fprintf(ofp,"#define VERSION_SANITY1 0x%08lx%s\n",
        version.entity_count, ul_sfx);
    Fprintf(ofp,"#define VERSION_SANITY2 0x%08lx%s\n",
        version.struct_sizes, ul_sfx);
    Fprintf(ofp,"\n");
    Fprintf(ofp,"#define VERSION_STRING \"%s\"\n", version_string(buf));
    Fprintf(ofp,"#define VERSION_ID \\\n \"%s\"\n",
        version_id_string(buf, cbuf));
    Fprintf(ofp,"\n");
#ifdef AMIGA
    {
    struct tm *tm = localtime((time_t *) &clocktim);
    Fprintf(ofp,"#define AMIGA_VERSION_STRING ");
    Fprintf(ofp,"\"\\0$VER: NetHack %d.%d.%d (%d.%d.%d)\"\n",
        VERSION_MAJOR, VERSION_MINOR, PATCHLEVEL,
        tm->tm_mday, tm->tm_mon+1, tm->tm_year+1900);
    }
#endif
    Fclose(ofp);
    return;
}
我还应该提到,当它在编译过程中达到这一点时,立即出现以下图像:

所以我们已经把问题缩小到了makedefs助手程序的范围(我想是吧?),它正在破坏一些东西,所以现在我想下一步应该是找出原因

编辑5:有人建议在编译Makedefs.c时使用一个特殊参数。我已经查看了Makefile以找出编译发生的位置,我想我已经找到了发生编译的位置,但我真的不知道这里发生了什么

$(U)makedefs.exe: $(MAKEOBJS)
    @$(link) $(LFLAGSU) -o$@ $(MAKEOBJS)

$(O)makedefs.o: $(CONFIG_H) $(INCL)/monattk.h $(INCL)/monflag.h \
     $(INCL)/objclass.h $(INCL)/monsym.h $(INCL)/qtext.h \
     $(INCL)/patchlevel.h $(U)makedefs.c $(O)obj.tag
    $(cc) $(CFLAGSU) -o$@ $(U)makedefs.c
我知道
$(*)
是一个变量或变量的Makefile等价物

$(U)
指向
$(UTIL)/
$(UTIL)
指向
。/UTIL
$(MAKEOBJS)
指向
$(O)makedefs.O$(O)monst.O$(O)objects.O
$(O)
指向
$(OBJ)/
,指向
O
,这将使
$(O)makedefs.O
O/makedefs.O
相同,考虑到我在半成功运行中观察到的行为(在大冻结之前编译了几个文件),这是有意义的

无论如何,
$(链接)
指向
gcc
$(LFLAGSU)
指向
$(LFLAGSBASEC)
哪个指向
$(linkdebug)
哪个指向
-g

$(CONFIG_H)
指向大量头文件:

CONFIG_H = $(INCL)/config.h $(INCL)/config1.h $(INCL)/tradstdc.h \
           $(INCL)/global.h $(INCL)/coord.h $(INCL)/vmsconf.h \
           $(INCL)/system.h $(INCL)/unixconf.h $(INCL)/os2conf.h \
           $(INCL)/micro.h $(INCL)/pcconf.h $(INCL)/tosconf.h \
           $(INCL)/amiconf.h $(INCL)/macconf.h $(INCL)/beconf.h \
           $(INCL)/ntconf.h $(INCL)/nhlan.h
$(包含)
指向
。/include
$(CFLAGSU)
指向
$(CFLAGSBASE)$(WINPFLAG)
$(CFLAGSBASE)
指向
-c$(cflags)-I$(包括)$(WINPINC)$(cdebug)
$(cflags)
指向
-mms位字段
$(WINPINC)
指向
-I$(WIN32)
$(WIN32)指向
。/win/WIN32
$(cdebug)
指向
-g
$(WINPFLAG)
指向
-DTILES-DMSWIN\u GRAPHICS-D\u WIN32\u IE=0x0400
。 就在那里。我想这就是我需要修改的内容,以使RossRidge-D_USE_32BIT_TIME_T所提到的工作正常

然而,既然我已经走了这么远,我真的想知道这些东西的一些含义。 查看第一行时,我看到
$(U)makedefs.exe:
。对我来说,这似乎是已编译输出文件的目标声明?对吗?另外,在
$(link)$(LFLAGSU)
之前和
-o$
之后的
@
是什么意思?在
-o
之后的
$
是什么意思

不管怎样,我想试试我的想法,看看它是否有效。 ... aa向
WINPFLAG
添加
-D\u USE\u 32BIT\u TIME\u T
无效

最终(ish)编辑:结果表明,罗斯里奇建议使用
-D\u use\u 32BIT\u TIME\T
标志是正确的。我的错误是把它放错地方了。如果查看框中的Makefile.gcc,请查看第165行(位于If语句中)。你想在最后加上
-D\u使用\u 32位时间\u T
。但是您还需要将其固定在IF语句的ELSE端的第176行的末尾。因此,整个区块看起来是这样的(不是一个巨大的变化,但如果你不这样做,并且你在我的情况下运行,它仍然会崩溃):

(我不知道我的回答是否值得称赞,因为如果没有哈利·约翰斯顿和英迪夫的评论,我不知道问题出在哪里,但我会尝试将这些评论扩展到一个完整的答案。)

正如
indiv
所解释的,
makedefs.exe
崩溃的原因是
ctime
返回NULL。通常情况下,您不会期望
ctime
执行此操作,因此我们需要检查文档,找出在什么情况下它会返回错误。由于MinGW被用来编译,我们需要查看微软的Visual C++文档。这是因为MinGW没有自己的C运行时,它只使用微软的

看着VisualStudioC运行Tim
################################################
#                                              #
# Nothing below here should have to be changed.#
#                                              #
################################################

ifeq  "$(GRAPHICAL)" "Y"
WINPORT  = $(O)tile.o $(O)mhaskyn.o $(O)mhdlg.o \
    $(O)mhfont.o $(O)mhinput.o $(O)mhmain.o $(O)mhmap.o \
    $(O)mhmenu.o $(O)mhmsgwnd.o $(O)mhrip.o $(O)mhsplash.o \
    $(O)mhstatus.o $(O)mhtext.o $(O)mswproc.o $(O)winhack.o
WINPFLAG   = -DTILES -DMSWIN_GRAPHICS -D_WIN32_IE=0x0400 -D_USE_32BIT_TIME_T
NHRES   = $(O)winres.o
WINPINC = -I$(WIN32)
WINPHDR = $(WIN32)/mhaskyn.h $(WIN32)/mhdlg.h $(WIN32)/mhfont.h \
    $(WIN32)/mhinput.h $(WIN32)/mhmain.h $(WIN32)/mhmap.h \
    $(WIN32)/mhmenu.h $(WIN32)/mhmsg.h $(WIN32)/mhmsgwnd.h \
    $(WIN32)/mhrip.h $(WIN32)/mhstatus.h \
    $(WIN32)/mhtext.h $(WIN32)/resource.h $(WIN32)/winMS.h
WINPLIBS =  -lcomctl32 -lwinmm
else
WINPORT = $(O)nttty.o
WINPFLAG= -DWIN32CON -D_USE_32BIT_TIME_T
WINPHDR =
NHRES   = $(O)console.o
WINPINC =
WINPLIBS = -lwinmm
endif