Я пытаюсь вызвать C DLL, созданную с помощью Visual Studio (выпуск сообщества 2015) из GHC (версия 7.8.3) для Windows.
Код 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 Platform, затем загрузите и скопируйте последнюю копию binutils в папку mingw платформы haskell. (D: \ Program Files \ Haskell Platform \ 7.10.2-a \ mingw для меня). Затем он начал жаловаться на zlib1.dll, поэтому я также скачал его с MSYS2 и вставил в папку mingw \ bin. После этого все заработало.
Похоже на этот вопрос. В принципе, ghc-7.8
В дистрибутиве содержатся ошибочные binutils, они неправильно обрабатывают .lib файлы Visual Studio Обходной путь должен обновить mingw
распространите или восстановите .lib файл. Посмотреть билет (а также # 10726) для деталей.
Других решений пока нет …