Почему ghc 8.8.4 не может скомпилировать файл, который может загрузить ghci?

#haskell #ghc #haskell-stack

#haskell #ghc #haskell-stack

Вопрос:

В Mac OS 10.15.7 с установленной платформой haskell у меня странное поведение. Код отлично работает в ghci, но связывание во время компиляции не работает:

 % ghc Merge.hs
Loaded package environment from /Users/ar/.ghc/x86_64-darwin-8.8.4/environments/default
[1 of 1] Compiling Main             ( Merge.hs, Merge.o ) [Optimisation flags changed]
Linking Merge ...
ld: can't open output file for writing: Merge, errno=21 for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
`gcc' failed in phase `Linker'. (Exit code: 1)
  

Но ghci работает нормально:

 % ghci Merge.hs
GHCi, version 8.8.4: https://www.haskell.org/ghc/  :? for help
Loaded package environment from /Users/ar/.ghc/x86_64-darwin-8.8.4/environments/default
[1 of 1] Compiling Main             ( Merge.hs, interpreted )
Ok, one module loaded.
*Main>
  

Кроме того, % stack runghc -- Merge работает, но

 % stack ghc -- Merge
[1 of 1] Compiling Main             ( Merge.hs, Merge.o ) [Data.Aeson changed]
Linking Merge ...
ld: can't open output file for writing: Merge, errno=21 for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
`gcc' failed in phase `Linker'. (Exit code: 1)
  

Есть идеи? Я установил платформу haskell, следуя инструкциям в https://www.haskell.org/downloads / с https://www.haskell.org/platform/mac.html (ghcup).

Код https://gist.github.com/arademaker/e7ae2e1ef5225807a3e627caa61481da

Комментарии:

1. У вас случайно уже есть каталог с именем Merge в вашем каталоге (или что-то еще, что может вызвать конфликт имен)?

2. Ох… @WillemVanOnsem, спасибо. Я так восхищен, я пытался понять платформу stack vs haskell и как работать с пакетами и т. Д. Да, я создал каталог в той же папке с тем же именем, и я забыл об этом…

3. ну, это случилось и со мной несколько лет назад :). Часто это не первая мысль, которая приходит в голову 🙂

4. Действительно, errno=21 это EISDIR «каталог». С одной стороны, я рад ld , что напечатал это. OTOH, он мог бы напечатать более удобочитаемое сообщение.

Ответ №1:

У меня был каталог с тем же именем в папке! Моя ошибка.