2015-10-31 82 views
2

我想在Windows上調用GHC(版本7.8.3)中使用visual studio(2015社區版)構建的C DLL。Haskell ghc visual studio 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 

複製所生成的64位的.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文件夾中。之後,它工作。

回答

2

似乎與this問題類似。基本上,ghc-7.8發行版包含有問題的binutils,它們不能正確處理Visual Studio .lib文件。解決方法是升級mingw分發或重新生成.lib文件。有關詳細信息,請參閱票證(還有#10726)。

+0

謝謝!希望他們在下一個版本中解決這個問題。 – user3042966

+0

方面的問題:它看起來編譯和運行的工作同樣好,只有.dll存在,沒有.lib文件,那麼是否有必要包含.lib? – user3042966

+0

@ user3042966基本上.dll包含鏈接器需要的所有內容。但有些鏈接程序無法從.dll中提取該信息,因此.lib存在。雖然我不知道所有細節。 – Yuras