2010-07-12 3 views
3

Je dois créer dll pour ce moduleHaskell compilation 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 

Je compilé:

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

aussi j'ai dllMain.o qui a créé comme http://haskell.org/ghc/docs/6.12.1/html/users_guide/win32-dlls.html et MyDef.def. Après que je fais suivant:

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 [email protected] 
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 

Comme je comprends faild parce il doit y avoir un seul module racine. Mais pourquoi puis-je utiliser Foreign. *? Pourquoi est-ce que je ne peux pas utiliser le module HighAPI? Dois-je écrire tout le programme dans un fichier? Merci.

Répondre

2

GHC 6.12 prend en charge la création d'une DLL unique contenant une bibliothèque Haskell et toutes ses dépendances, y compris le serveur RTS. Il ne peut pas créer des DLL séparées de code Haskell qui s'appellent l'une l'autre, bien que cette fonctionnalité soit implémentée et puisse être disponible dans le prochain GHC 6.14.1.

Pour répondre à votre question, vous devez également lier dans le module HighAPI lorsque vous créez la DLL avec ghc -shared. Plus d'informations sur la création de DLL Haskell est disponible dans un blog post by Neil Mitchell (lisez ceci, parce que les informations contenues dans le guide de l'utilisateur de GHC sont fausses au sujet de quelques choses, en particulier comment utiliser DllMain).

+0

Merci. J'ai lu ce blog. Je n'ai pas vu l'exemple comment créer une DLL avec un lien vers d'autres modules. – Anton

+0

Anton: vous devez lier ensemble * tous les modules de votre bibliothèque. par exemple. 'ghc -shared -o MarketNews.dll HighAPI.o MarketNews.o MarketNews_stub.o dllMain.o MyDef.def'. –

+0

Ça ne marche pas, je l'ai essayé encore et encore. Je reçois des erreurs comme: HighAPI.o: faux :(texte + 0x14f):. Undefined reference to '__stginit_datetimezm0zi2_D ataziDateTime_ » collect2: ld retourné 1 état de sortie – Anton