2015-10-31 2 views
2

Я пытаюсь вызвать C DLL, созданную с визуальной студией (версия сообщества 2015 года) из GHC (версия 7.8.3) на окнах.Haskell ghc visual studio DLL странное поведение

С код: (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, никакого вывода не печатается. Даже сообщение об ошибке. Почему это происходит?

EDIT: Вот что я сделал, чтобы исправить это. Установите последнюю платформу Haskell, затем загрузите и скопируйте последнюю копию binutils в папку mingw на платформе haskell. (D: \ Program Files \ Haskell Platform \ 7.10.2-a \ mingw для меня). Затем он начал жаловаться на zlib1.dll, поэтому я также загрузил его из MSYS2 и вставил его в папку mingw \ bin. После этого все сработало.

ответ

2

Похоже на this выпуск. В основном, ghc-7.8 дистрибутив содержит багги binutils, они не обрабатывают файлы .lib Visual Studio. Обходной путь заключается в обновлении mingw распространения или регенерации файла .lib. См. Билет (а также #10726).

+0

Спасибо! Надеюсь, они исправит это в следующем выпуске. – user3042966

+0

вопрос стороны: он выглядит компилируемым и работающим, работает одинаково хорошо, имея только .dll, без файла .lib, поэтому нужно ли включать .lib? – user3042966

+0

@ user3042966 в основном .dll содержит все необходимые ссылки. Но некоторые линкеры не могут извлечь эту информацию из .dll, поэтому .lib существует. Однако я не знаю всех деталей. – Yuras