GHC: как создать 32-битную DLL с помощью 64-битной GHC? (Для вызова функций из с ++)

Я хотел бы построить 32-битную DLL с 64-битным GHC. И вот минимальный пример.

Test.hs

{-# LANGUAGE ForeignFunctionInterface #-}
module Test where

import Foreign.C.Types

foreign export ccall c_hello :: IO()
foreign export ccall boo :: CInt

c_hello :: IO()
c_hello = do
    print "Hello!" 

init_exit.cpp

#include "Test_stub.h"
#include <C:\Program Files\Haskell Platform\8.0.1\lib\include\Rts.h>

#define DLLExport extern "C" __declspec(dllexport)

DLLExport void hello()
{
    c_hello();    
}

DLLExport int HsStart()
{
    int argc = 1;
    char* argv[] = {"ghcDLL", NULL};

    char** args = argv;
    hs_init(&argc, &args);

    printf("Haskell library has been initialized!\n");
    return 0;
}

DLLExport int HsEnd()
{
    hs_exit();

    printf("Haskell library has been finalized!\n");
    return 0;
}

А затем я строю библиотеку, используя следующие команды:

ghc -c -O Test.hs 
ghc -c init_exit.cpp 
ghc -shared -o Test.dll Test.o init_exit.o

Какие флаги я должен передать ghc или, возможно, gcc для создания 32-битной DLL вместо 64-битной? Или, может быть, есть другой способ сделать это.

1 ответ

Решение

Обычная 64-битная сборка Windows GHC (например, та, которую вы можете загрузить с веб-сайта GHC) способна создавать только 64-битные объектные файлы. Например, он не включает 32-битные версии каких-либо библиотек, которые поставляются с GHC.

Вы можете создать 32-битный кросс-компилятор с Windows на 64-битную версию или просто запустить обычную 32-битную сборку Windows GHC (возможно, намного проще).

Другие вопросы по тегам