Ошибка GHC с системой на OS X Lion - PullRequest
3 голосов
/ 13 ноября 2011

Я пытался скомпилировать и связать простую программу, используя ghc, но она не удалась во время компоновки:

import System (getArgs)

main = do
    args <- getArgs
    print args

Я пытался скомпилировать с

% ghc -c -O Main.hs
% ghc -o Main Main.o
ld: warning: could not create compact unwind for .LFB3: non-standard register 5 being saved in prolog
Undefined symbols for architecture i386:
  "___stginit_haskell98zm1zi1zi0zi1_System_", referenced from:
      ___stginit_Main_ in Main.o
ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status
zsh: exit 1     ghc -o Main Main.o

Однако при компиляции с -make:

% ghc --make Main.hs

все работает (кроме тонн предупреждений ld)

Еще немного информации об окружении:

% ghc --version
The Glorious Glasgow Haskell Compilation System, version 7.0.3

Из платформы Haskell для Mac OS X 10.6 (Intel, 32-битный GHC)

Система: Max OS X Lion 10.7.2

Есть идеи, что случилось?

(Кстати, я пытался установить HP x64, но это не удалосьво время установки)

Ответы [ 2 ]

5 голосов
/ 13 ноября 2011

Майкл исторически прав. С --make ghc выясняет, какие пакеты он должен использовать, и связывает сам по себе (если два установленных пакета не предоставляют одно и то же имя модуля, то он не может определить, какой из них использовать), без --make, у вас есть сказать это. Однако по состоянию на 7.0 --make является режимом по умолчанию для ghc, поэтому обычный ghc Main.hs теперь совпадает с ghc --make Main.hs. Разница здесь в двухэтапной компиляции. Я не знаю точных деталей, но причина в том, что модуль System находится в пакете haskell98 (предложение, пожалуйста, используйте иерархические модули, getArgs должен быть импортирован через System.Environment, начиная с 7.2, haskell98 может ' не может использоваться вместе с base), который по умолчанию не связан. Поэтому ghc -o Main Main.o не находит символ в пакетах по умолчанию. Вы должны явно указать это, чтобы посмотреть в пакете haskell98, ghc -c -O Main.hs; ghc -package haskell98 -o Main Main.o должно работать (и это работает здесь, я проверял 7.0.4, чтобы убедиться).

3 голосов
/ 13 ноября 2011

Возможно, это потому, что вы используете что-то из System? ghc --make, вероятно, автоматически определяет, какие библиотеки Haskell нужно связать, а ghc сама по себе этого не делает.

...