`gcc.exe' 在 /dist-newstyle/ 文件夹中的阶段 `C 预处理器' 错误消息中失败

问题描述 投票:0回答:3

我有一个关于“语言和编译器”主题的项目,我们在 Haskell 中编写解析器。目前我正在开发这个

2-Arrow
项目,我们使用 'alex' 和 'happy' 库从 lexer.x 和 parser.y 文件创建 parser.hs 和 lexer.hs 文件。在尝试构建我的框架(在项目目录中的
cabal build
)时,我收到以下错误消息:

C:\\ ... \2-Arrow\dist-newstyle\build\x86_64-windows\ghc-9.2.4\assignment-arrow-0.1.0.0\x\arrow\build\arrow\arrow-tmp\Lexer.hs:1:1: error:
    `gcc.exe' failed in phase `C pre-processor'. (Exit code: 1)
  |
 1| {-# OPTIONS_GHC -fno-warn-unused-binds -fno-warn-missing-signatures #-}
  | ^

C:\\ ... \2-Arrow\dist-newstyle\build\x86_64-windows\ghc-9.2.4\assignment-arrow-0.1.0.0\x\arrow\build\arrow\arrow-tmp\Parser.hs:1:1: error:
    `gcc.exe' failed in phase `C pre-processor'. (Exit code: 1)
  |
1 | {-# OPTIONS_GHC -w #-}  
  | ^

如果它们是源自我编写的代码的错误消息,我至少会有一个寻找解决方案的方向,但这些错误来自

/dist-newstyle/
文件夹。据我了解,这是用于构建程序的中间文件的文件夹。所以我现在有点走进了死胡同,因为重新安装“happy”和“alex”,并将 cabal 更新到最新版本都没有改变任何东西。有人对解决此错误有任何建议吗?非常感谢任何帮助!!

(来自uni的项目框架:https://www.cs.uu.nl/docs/vakken/b3tc/downloads-2018/2-Arrow.zip(取决于“happy”和“alex”包)。一开始我以为问题可能出在框架上,但是我咨询了教授,他说其他人没有问题,所以我不认为这是问题)

c haskell gcc build temporary-files
3个回答
1
投票

我无法在 Windows 10 上使用全新的 GHCup 安装来重现该问题,但错误消息表明 Glasgow Haskell 编译器 (GHC) 调用的 GNU C 编译器 (GCC) 的已安装版本可能存在问题将 C 预处理器应用于某些 Haskell 源文件,包括 Alex 从

Lexer.hs
文件生成的
Lexer.x
源文件,以及 Happy 从
Parser.hs
文件生成的
Parser.y
源文件.

尝试创建一个简单的

test.hs
程序来调用 C 预处理器:

{-# LANGUAGE CPP #-}
#define HELLO "Hello, world!"
main = putStrLn HELLO

并尝试使用

ghc test.hs
进行编译。假设失败并出现与上面相同的错误,请尝试
ghc -v test.hs
,您应该在输出中找到以以下内容开头的行:

*** C pre-processor
"C:\...\gcc.exe" "-E" "-undef" ...blah blah blah...

我的成功汇编摘录如下。也许您可以发现您的安装出了什么问题。请注意,我的调用了 GHCup 安装版本的 GCC,并将输出定向到临时文件区域,然后由 GHC 进行编译。如果调用了错误的 GCC 或临时文件区域由于某种原因不可写,则可能会导致您遇到的问题。

*** C pre-processor:
"C:\ghcup\ghc\9.2.5\lib\../mingw/bin/gcc.exe" "-E" "-undef" "-traditional" "-IC:\ghcup\ghc\9.2.5\lib\x86_64-windows-ghc-9.2.5\base-4.16.4.0\include" "-IC:\ghcup\ghc\9.2.5\lib\x86_64-windows-ghc-9.2.5\ghc-bignum-1.2\include" "-IC:\ghcup\ghc\9.2.5\lib\x86_64-windows-ghc-9.2.5\rts-1.0.2\include" "-include" "C:\ghcup\ghc\9.2.5\lib\x86_64-windows-ghc-9.2.5\rts-1.0.2\include\ghcversion.h" "-Dmingw32_BUILD_OS" "-Dx86_64_BUILD_ARCH" "-Dmingw32_HOST_OS" "-Dx86_64_HOST_ARCH" "-D__GLASGOW_HASKELL_TH__" "-D__SSE__" "-D__SSE2__" "-D__IO_MANAGER_WINIO__=1" "-D__IO_MANAGER_MIO__=1" "-includeC:\Users\buhr\AppData\Local\Temp\ghc7128_0\ghc_2.h" "-x" "assembler-with-cpp" "test.hs" "-o" "C:\Users\buhr\AppData\Local\Temp\ghc7128_0\ghc_1.hscpp"
!!! systool:cpp: finished in 31.25 milliseconds, allocated 0.311 megabytes
!!! Chasing dependencies: finished in 46.88 milliseconds, allocated 2.719 megabytes
Stable obj: {}
Stable BCO: {}
Ready for upsweep
  [NONREC
      ModSummary {
         ms_hs_date = 2022-12-18 20:54:57.2679991 UTC
         ms_mod = Main,
         ms_textual_imps = [(Nothing, Prelude)]
         ms_srcimps = []
      } []]
*** Deleting temp files:
Deleting: C:\Users\buhr\AppData\Local\Temp\ghc7128_0\ghc_2.h
compile: input file C:\Users\buhr\AppData\Local\Temp\ghc7128_0\ghc_1.hscpp
*** Checking old interface for Main (use -ddump-hi-diffs for more details):
[1 of 1] Compiling Main             ( test.hs, test.o )

0
投票

我去参加研讨会并向助教寻求帮助。一段时间后,他提出可能是文件夹位置有问题。你瞧,将文件夹从我的 OneDrive 文件夹(也保存在本地)移动到我的

C:\\
目录后,项目终于编译了!我不知道为什么会出现这种情况,所以我在这里发布了另一个问题文件夹位置使 Haskell 项目无法编译


0
投票

有个同学也有同样的问题。通过将解决方案移动到另一个文件夹,他的问题得到了解决。我的理论是文件夹名称不能太长。

此外,请尽量避免在解决方案的路径中使用特殊字符。

© www.soinside.com 2019 - 2024. All rights reserved.