Я пытаюсь вызвать 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. После этого все сработало.
Спасибо! Надеюсь, они исправит это в следующем выпуске. – user3042966
вопрос стороны: он выглядит компилируемым и работающим, работает одинаково хорошо, имея только .dll, без файла .lib, поэтому нужно ли включать .lib? – user3042966
@ user3042966 в основном .dll содержит все необходимые ссылки. Но некоторые линкеры не могут извлечь эту информацию из .dll, поэтому .lib существует. Однако я не знаю всех деталей. – Yuras