2016-10-13 8 views
3

64ビットGHCで32ビットDLLを構築したいと思います。そしてここに最小限の例があります。GHC:64ビットGHCを使用して32ビットDLLを構築する方法は? (関数をC++から呼び出す)

Test.hs

#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; 
} 

init_exit.cpp

{-# 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!" 

そして私は、次のコマンドを使用して、ライブラリーを構築:

GH C -c -O Test.hs

GHC -c init_exit.cpp

GHC -shared -o Test.dllのTest.o init_exit.o

何のフラグ私はGHCに渡す必要がありますかおそらく64ビットの代わりに32ビットのDLLを構築するgccに?あるいは、これを行う別の方法があります。

+1

おそらくこのリンク:https://ghc.haskell.org/trac/ghc/wiki/Building/Compiling32on64が役立ちますか? –

+0

@TomaszLewowski私のせいで、私はこの特定のマシンにWindowsがあることを指定するのを忘れてしまいます。 –

答えて

3

通常のWindows 64ビットGHCビルド(GHC Webサイトからダウンロードできるものなど)は、64ビットのオブジェクトファイルのみをビルドすることができます。たとえば、GHCに付属するライブラリの32ビット版は含まれていません。

Windows 64ビット版からWindows 32ビット版のクロスコンパイラをビルドするか、通常のWindows 32ビット版のGHCを実行するだけです(これははるかに簡単です)。

関連する問題