在GHC中指定arch?

时间:2011-04-04 07:35:09

标签: haskell x86 x86-64 ncurses ghc

我正在编写一个多平台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来指定架构,类似于GCC的-march

2 个答案:

答案 0 :(得分:2)

看起来你的ghc配置为32位(i386),而ncurses库是64位(x86-64)。我相信最新的Haskell平台(2011.2.x.x)使用​​的是64位ghc,而早期版本提供了32位ghc。

如果您使用的是早期的HP,升级到最新版本可能足以解决此问题。

不幸的是,ghc不是本机交叉编译器,您无法通过标志设置体系结构或字大小。您需要为要使用的每个体系结构单独使用ghc,并且还需要确保链接的所有库都与之匹配。

(BTW,x86不足以区分架构,因为它可以指32位或64位。传统上它指的是32位版本,但并非总是如此。至少在OSX 10.6上使用XCode 3 ,gcc拒绝它作为-march的无效值

答案 1 :(得分:1)

使用cabal,并设置特定于arch的标志,以便将库包含在.cabal文件中。

E.g。

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

强制 GHC进行交叉编译(正如您所希望的那样),您需要安装x86版本的GHC(32位)。