2011-04-04 10 views
6

Estoy escribiendo un juego multiplataforma ncurses de texto y aventuras. La biblioteca de C requerida, ncursesw, está configurada para x86, pero mi sistema operativo es Mac OS X 10.6.6 x86_64.Especifique el arco en GHC?

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) 

Calculo que es mucho más fácil de forzar la compilación para x86 que convencer a Homebrew, MinGW y repositorios de aptitud para incluir una biblioteca x86_64 ncursesw.

¿Existe una opción de línea de comando que pueda pasar a ghc para especificar la arquitectura, similar a -march para GCC?

+0

Al revisar la página del manual no se revela nada por el estilo, desafortunadamente. –

+0

@Rafe Sé :( – mcandre

+0

Estaba buscando una solución a este problema. Este es un comentario para lectores futuros. Linux https://ghc.haskell.org/trac/ghc/wiki/Building/Compiling32on64; https de Windows: //ghc.haskell.org/trac/ghc/wiki/Building/Preparation/Windows –

Respuesta

2

Parece que su ghc está configurado para 32 bits (i386), mientras que la biblioteca ncurses es de 64 bits (x86-64). Creo que la Plataforma Haskell más reciente (2011.2.x.x) utiliza un ghc de 64 bits, mientras que las versiones anteriores proporcionaban un ghc de 32 bits.

Si está utilizando un HP anterior, la actualización a la última versión es probablemente suficiente para resolver este problema.

Desafortunadamente ghc no es un compilador cruzado nativo, y no puede establecer la arquitectura, o el tamaño de palabra, a través de un indicador. Necesita un ghc por separado para cada arquitectura que quiera usar, y también deberá asegurarse de que todas las bibliotecas que enlaza coincidan.

(Por cierto, x86 no es suficiente para distinguir una arquitectura, ya que puede referirse a 32 bits o 64 bits. Convencionalmente se refiere a la versión de 32 bits, pero no siempre. Al menos en OSX 10.6 con XCode 3, gcc rechaza como un valor no válido para -march)

1

Utilice cabal, y configure indicadores específicos de arco para qué biblioteca incluir en el archivo .cabal.

E.g.

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

Para fuerza GHC de compilación cruzada (como usted está queriendo hacer), tendrá que instalar una versión x 86 de GHC (32 bits).

+0

Estoy usando el paquete oficial Haskell Platform Mac OS X, por lo que debería ser x86 (y no debería tener este problema). A menos que i386 sea diferente de x86. – mcandre

+0

@mcandre: si por 'x86' te refieres' x86-64', entonces son diferentes. –

Cuestiones relacionadas