GHC:如何使用64位GHC构建32位DLL?(用于从C++调用函数)

3
我想用64位GHC构建32位DLL。这里是最简单的示例。
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
也许这个链接可以帮到你:https://ghc.haskell.org/trac/ghc/wiki/Building/Compiling32on64 - Tomasz Lewowski
@TomaszLewowski 抱歉,这次我忘了说明我在这台特定的机器上使用的是Windows系统。 - O.Phillips
1个回答

3

普通的 Windows 64 位 GHC 构建(例如您可以从 GHC 网站下载的那个)只能构建 64 位目标文件。例如,它不包括任何随 GHC 一起提供的 32 位库的版本。

您的选择是构建一个 Windows 64 位到 Windows 32 位的交叉编译器,或者只运行普通的 Windows 32 位 GHC 构建(可能更容易)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接