使用GHC 64位构建的简单Windows DLL无法链接

时间:2015-02-05 03:08:24

标签: c++ windows haskell dll visual-studio-2013

对于概念验证,我想将一些简单的Haskell代码链接到我的Visual C ++应用程序(使用Visual Studio 2013)。使用GHC 7.8.3 32位构建,但使用GHC 7.8.4 64位构建不会(注意GHC版本中的轻微差异)。

有3个文件:Grep.hsStartEnd.c是使用GHC构建的,以形成DLL。 main.cpp是使用Visual Studio 2013构建的,并尝试在DLL库中进行链接。

我正在构建DLL:

> ghc -shared -O -optc-O -o Grep.dll StartEnd.c Grep.hs

在Visual Studio中,我只是链接到Grep.dll.a并包含C:\Program Files\MinGHC-7.8.4\ghc-7.8.4\lib\include,但链接失败并且

1>main.obj : error LNK2001: unresolved external symbol _HsEnd
1>main.obj : error LNK2001: unresolved external symbol _freegrep
1>main.obj : error LNK2001: unresolved external symbol _grep
1>main.obj : error LNK2001: unresolved external symbol _HsStart
1>C:\Code\Grep\dist\Win32\Release\Grep.exe : fatal error LNK1120: 4 unresolved externals

当我使用32位但不是64位构建时,完全相同的过程有效。我能做错什么? (我在尝试链接64位库时正在构建一个64位应用程序。)

源文件:

Grep.hs

{-# LANGUAGE ForeignFunctionInterface #-}

module Grep where

import Foreign
import Foreign.C.String
import Data.List (isInfixOf)

filterlines f = unlines . filter f . lines

grep :: CString -> CString -> IO CString
grep i s = do
    ii <- peekCString i
    ss <- peekCString s
    newCString $ (filterlines (isInfixOf ii)) ss

freegrep :: CString -> IO ()
freegrep s = free s

foreign export ccall grep :: CString -> CString -> IO CString
foreign export ccall freegrep :: CString -> IO ()

StartEnd.c

#include <Rts.h>

void HsStart()
{
   int argc = 1;
   char* argv[] = {"ghcDll", NULL}; // argv must end with NULL

   // Initialize Haskell runtime
   char** args = argv;
   hs_init(&argc, &args);
}

void HsEnd()
{
   hs_exit();
}

的main.cpp

#include <HsFFI.h>
#include <Grep_stub.h>
#include <iostream>

extern "C" {
    void HsStart();
    void HsEnd();
}

int main(int argc, char* argv[])
{
    HsStart();
    HsPtr str;

    str = grep("test", "This is a test\nwith many lines\nand it failed\nand the test passed");
    if (str)
    {
        std::cout << (char*) str;
        freegrep(str);
    }

    HsEnd();
    return 0;
}

1 个答案:

答案 0 :(得分:1)

感谢评论,我将实际的错误输出添加到帖子中。这让我注意到Visual Studio令人困惑的配置管理界面再次让我感到困惑。即使我的配置设置为Win32,它仍在尝试构建x64版本。长话短说,它正在发挥作用!