Укажите арку в GHC? - PullRequest
       25

Укажите арку в GHC?

6 голосов
/ 04 апреля 2011

Я пишу мультиплатформенную текстовую приключенческую игру ncurses. Требуемая библиотека C, ncursesw, настроена для x86, но моя ОС - Mac OS X 10.6.6 x86_64.

ghc --make -o rogue rogue.hs
[1 of 2] Compiling Dungeon          ( Dungeon.hs, Dungeon.o )
[2 of 2] Compiling Main             ( rogue.hs, rogue.o )
Linking rogue ...
ld: warning: in /usr/local/lib/libncursesw.dylib, file was built for unsupported file format which is not the architecture being linked (i386)

Я полагаю, что навязать компиляцию для x86 гораздо проще, чем убедить репозитории Homebrew, MinGW и Aptitude включить библиотеку x86_64 ncursesw.

Есть ли опция командной строки, которую я могу передать ghc, чтобы указать архитектуру, аналогичную -march для GCC?

Ответы [ 2 ]

2 голосов
/ 04 апреля 2011

Похоже, ваш ghc настроен на 32-разрядную (i386), а библиотека ncurses - 64-разрядная (x86-64). Я считаю, что в самой последней платформе Haskell (2011.2.x.x) используется 64-разрядный GHC, тогда как в более ранних версиях использовался 32-разрядный GHC.

Если вы используете более раннюю версию HP, вероятно, для решения этой проблемы достаточно обновить ее до последней версии.

К сожалению, ghc не является нативным кросс-компилятором, и вы не можете установить архитектуру или размер слова с помощью флага. Вам нужен отдельный ghc для каждой архитектуры, которую вы хотите использовать, и вам также нужно убедиться, что все библиотеки, на которые вы ссылаетесь, соответствуют ему.

(Кстати, x86 недостаточно для различения архитектуры, поскольку она может относиться как к 32-битной, так и к 64-битной. Обычно это относится к 32-битной версии, но не всегда. По крайней мере, в OSX 10.6 с XCode 3, gcc отклоняет его как недопустимое значение для -march)

1 голос
/ 04 апреля 2011

Используйте cabal и установите специфичные для арки флаги, для которых библиотека будет включена в файл .cabal.

* 1003 Е.Г. *

> if flag(use_altivec)
>         cc-options:
>             -DHAVE_ALTIVEC

Чтобы принудительно GHC выполнить кросс-компиляцию (как вы этого хотите), вам необходимо установить версию GHC для 32-разрядной системы x86 (*).

...