Haskell编译dll

3

我需要为这个模块创建动态链接库(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

我有一个类似http://haskell.org/ghc/docs/6.12.1/html/users_guide/win32-dlls.html的dllMain.o文件和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
GHC 6.12支持创建一个包含Haskell库及其所有依赖项(包括运行时系统)的单个DLL。它不能创建互相调用的Haskell代码的分离DLL,尽管该功能已经实现并可能在即将发布的GHC 6.14.1中可用。
要回答您的问题,在使用“ghc -shared”创建DLL时,您还需要链接“HighAPI”模块。有关创建Haskell DLL的更多信息,请参阅Neil Mitchell的博客文章(请阅读此文,因为GHC用户指南中的某些信息是错误的,特别是如何使用“DllMain”)。

谢谢。我读了这篇博客。但是我没有看到如何创建带有其他模块链接的DLL的示例。 - Anton
Anton:你需要将所有库中的模块链接在一起。例如 ghc -shared -o MarketNews.dll HighAPI.o MarketNews.o MarketNews_stub.o dllMain.o MyDef.def - Simon Marlow
它不起作用,我稍后再试一次。我收到了以下错误:HighAPI.o:fake:(.text+0x14f): undefined reference to `_stginit_datetimezm0zi2_D ataziDateTime' collect2: ld returned 1 exit status - Anton
我认为错误来自于 Data.DateTime 模块。我该如何链接到它? - Anton
3
成功了。我找到了如何链接包的方法:ghc -shared -o MarketNews.dll HighAPI.o MarketNews.o MarketNews_stub.o dllMain.o MyDef.def -package datetime - Anton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接