Haskell скомпилировать dll - PullRequest
3 голосов
/ 12 июля 2010

Мне нужно создать DLL для этого модуля

module MarketNews where
import Foreign
import Foreign.C.Types
import Foreign.C.String

import HighAPI(getNextNewsInfo)

getNextNewsInfoM :: IO CString
getNextNewsInfoM = getNextNewsInfo >>= \x -> newCString x

foreign export stdcall getNextNewsInfoM :: IO CString

Я скомпилировал:

 C:\Users\test_8\Documents\Project\MarketNews\src>ghc --make MarketNews.hs  -fglasgow
-exts

Также у меня есть dllMain.o, который создан как http://haskell.org/ghc/docs/6.12.1/html/users_guide/win32-dlls.html и MyDef.def. После этого я делаю следующее:

C:\Users\test_8\Documents\Project\MarketNews\src>ghc -shared -o MarketNews.dll M
arketNews.o MarketNews_stub.o dllMain.o MyDef.def
Creating library file: MarketNews.dll.a
Warning: resolving _getNextNewsInfoM by linking to _getNextNewsInfoM@0
Use --enable-stdcall-fixup to disable these warnings
Use --disable-stdcall-fixup to disable these fixups
MarketNews.o:fake:(.text+0x6b): undefined reference to `HighAPI_getNextNewsInfo_
closure'
MarketNews.o:fake:(.text+0x12d): undefined reference to `__stginit_HighAPI_'
MarketNews.o:fake:(.data+0x10): undefined reference to `HighAPI_getNextNewsInfo_
closure'
collect2: ld returned 1 exit status

Как я понимаю, это не удалось, потому что должен быть один корневой модуль . Но почему я могу использовать Foreign. *? Почему я не могу использовать модуль HighAPI? Должен ли я написать всю программу в одном файле? Спасибо.

1 Ответ

2 голосов
/ 15 июля 2010

GHC 6.12 поддерживает создание одной библиотеки DLL, содержащей библиотеку Haskell и все ее зависимости, включая RTS. Он не может создавать отдельные библиотеки DLL из кода на Haskell, которые вызывают друг друга, хотя эта функция реализована и может быть доступна в следующем выпуске GHC 6.14.1.

Чтобы ответить на ваш вопрос, вам также необходимо указать ссылку в модуле HighAPI при создании библиотеки DLL с ghc -shared. Более подробную информацию о создании библиотек DLL на Haskell можно найти в блоге , написанном Нилом Митчеллом (прочитайте это, потому что информация в руководстве пользователя GHC неверна в отношении некоторых вещей, в частности, как использовать DllMain).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...