Haskell ghc visual studio DLL的怪异行为

Haskell ghc visual studio DLL weird behaviour

本文关键字:DLL ghc visual studio Haskell      更新时间:2023-10-16

我正试图在windows上从GHC(7.8.3版)调用visual studio(2015社区版)构建的C DLL。

C代码:(myDLL.cpp)

extern "C" {
    __declspec(dllexport) int someFn() {
        return 42;
    }
}

Haskell代码:(Main.hs)

module Main where
import Foreign.Ptr
import Foreign.C.Types 
import Data.Int
foreign import ccall unsafe "someFn" c_someFn :: CInt
mySomeFn = c_someFn
main :: IO ()
main = do let z = mySomeFn
          print z

将生成的x64.dll、.lib和.hs文件复制到同一文件夹并运行之后

 ghci -L. -lmyDLL Main.hs
 ...
 >main

它按预期打印'42'。

运行

ghc -L. -lmyDLL Main.hs

编译和链接很好,但在执行main.exe之后,不会打印任何输出。甚至没有错误消息。为什么会发生这种情况?

编辑:以下是我修复它的方法。安装最新的Haskell平台,然后下载并复制binutils的最新副本到Haskell的mingw文件夹。(对我来说,D:\Program Files\Haskell Platform\7.10.2-a\mingw)。接下来,它开始抱怨zlib1.dll,所以我也从MSYS2下载了它,并将它粘贴到了mingw\bin文件夹中。在那之后,它起了作用。

似乎与此问题类似。基本上,ghc-7.8发行版包含有缺陷的binutils,它们不能正确处理VisualStudio.lib文件。解决方法是升级mingw分发版或重新生成.lib文件。详细信息请参见票证(以及#10726)。