无法使用 MinGW 编译先前修改的 Nethack - 缓存问题?

Posted

技术标签:

【中文标题】无法使用 MinGW 编译先前修改的 Nethack - 缓存问题?【英文标题】:Cannot compile previously-modified Nethack using MinGW - Caching issue? 【发布时间】:2015-03-16 09:08:35 【问题描述】:

所以最近,我在搞乱 Nethack 的源代码,这是一款相当古老的游戏。我使用本指南来帮助我入门:Compiling - Wikihack。

为了测试,我首先编译了原始源代码。稍作调整后,我就可以毫无问题地运行它。接下来,我稍微编辑了源代码,并在现有怪物的基础上添加了两个示例怪物。游戏编译没有任何问题,我的测试怪物出现在游戏中。

在那之后,我尝试稍微调整一下怪物并重新编译。但是出于某种原因,我的任何调整都没有出现。我决定删除所有内容并从头开始,再次重建原始源,尚未进行任何修改。现在突然间,我遇到了错误,引用了丢失的测试怪物。

这怎么可能?我仔细检查了这个测试怪物不在源代码中(为什么应该在源代码中?它是原始源代码)。我唯一的解释是编译器出于某种原因正在缓存以前的数据。完全清空 monst.c 没有任何区别,但删除它会使编译器抱怨缺少文件。

这是有问题的错误:

C:\Nethack-src\nethack-3.4.3\src>mingw32-make -f makefile.gcc install
----
NOTE: This build will include tile support.
----
creating directory o
gcc -c -mms-bitfields -I../include -I../win/win32 -g -DTILES -DMSWIN_GRAPHICS -D
_WIN32_IE=0x0400 -oo/makedefs.o ../util/makedefs.c
gcc -c -mms-bitfields -I../include -I../win/win32 -g -DTILES -DMSWIN_GRAPHICS -D
_WIN32_IE=0x0400 -DDLB  -oo/monst.o /monst.c
/monst.c:1:9: error: expected declaration specifiers or '...' before string cons
tant
     MON("test lizard", S_LIZARD,
         ^
/monst.c:1:24: error: unknown type name 'S_LIZARD'
     MON("test lizard", S_LIZARD,
                        ^
/monst.c:2:2: error: unknown type name 'LVL'
  LVL(12, 16, 0, 50, 7), (G_GENO|1),
  ^
/monst.c:2:25: error: expected declaration specifiers or '...' before '(' token
  LVL(12, 16, 0, 50, 7), (G_GENO|1),
                         ^
/monst.c:3:2: error: unknown type name 'A'
  A(ATTK(AT_CLAW, AD_PHYS, 1, 10), NO_ATTK,
  ^
/monst.c:5:2: error: unknown type name 'SIZ'
  SIZ(2600, 400, 0, MS_MUMBLE, MZ_HUGE), MR_POISON, MR_POISON,
  ^
/monst.c:5:41: error: unknown type name 'MR_POISON'
  SIZ(2600, 400, 0, MS_MUMBLE, MZ_HUGE), MR_POISON, MR_POISON,
                                         ^
/monst.c:5:52: error: unknown type name 'MR_POISON'
  SIZ(2600, 400, 0, MS_MUMBLE, MZ_HUGE), MR_POISON, MR_POISON,
                                                    ^
/monst.c:6:2: error: unknown type name 'M1_NOLIMBS'
  M1_NOLIMBS|M1_SLITHY|M1_THICK_HIDE|M1_OVIPAROUS|M1_POIS|M1_NOTAKE|
  ^
/monst.c:8:2: error: unknown type name 'M2_STRONG'
  M2_STRONG, 0, CLR_GREEN),
  ^
/monst.c:8:13: error: expected declaration specifiers or '...' before numeric co
nstant
  M2_STRONG, 0, CLR_GREEN),
             ^
/monst.c:8:16: error: unknown type name 'CLR_GREEN'
  M2_STRONG, 0, CLR_GREEN),
                ^
makefile.gcc:252: recipe for target 'o/monst.o' failed
mingw32-make: *** [o/monst.o] Error 1

C:\Nethack-src\nethack-3.4.3\src>pause
Press any key to continue . . .

我该如何解决这个问题?

【问题讨论】:

不要发布指向代码或错误或其他重要信息的链接,您不知道该链接是否或何时会变得陈旧或无效。始终在问题中包含重要信息。 至于你的错误,你没有忘记逗号、右括号或类似的东西吗?从显示错误的第一行开始,如果一切正常,则转到 previous 行并查看该行,依此类推。 @JoachimPileborg 我真的很确定我的代码没有犯任何错误,因为这些错误发生在不是我自己的代码中,并且以前曾经工作过。我没有以任何方式修改它。我什至重新下载了源代码并尝试编译它,但我遇到了同样的错误。另外,感谢您提供有关错误链接的提示,我们会​​尽快修复。 【参考方案1】:

看一下构建命令:

gcc -c -mms-bitfields -I../include -I../win/win32 -g
    -DTILES -DMSWIN_GRAPHICS -D _WIN32_IE=0x0400 -DDLB  -oo/monst.o /monst.c

它在一个完全不同的目录中查看monst.c,即/

您可能在原始更改后在 makefile 中引入了此错误;那是您的代码更改也停止生效的时间。

【讨论】:

谢谢,这就是问题所在!原来我在备份方面有点混乱,我实际上在我的 C 驱动器的根目录中备份了一个小代码 sn-p。当构建命令在寻找 monst.c 时,它在我的 C 驱动器的根目录中找到它,不完整且全部。我删除了该文件,它现在编译成功。非常感谢。

以上是关于无法使用 MinGW 编译先前修改的 Nethack - 缓存问题?的主要内容,如果未能解决你的问题,请参考以下文章

使用 MinGW 编译 - 无法识别的命令行选项

无法在 Windows 上使用 MinGW 编译 google 测试

使用 MinGW - Initgraph() 无法编译

在 Win7 上无法使用 MinGW 编译 RIES

使用 Qt Creator / qmake / MinGw 的预编译标头无法在调试版本中工作

MinGW:C++ 编译器无法创建可执行文件