The issue you are experiencing is the result of ghci not using import libraries to resolve external symbols. Just a bit of explanation for reference, which will also help you understand the solution to your problem. Take for example the function declared as int myexport(int x){...} when creating a dll the exported definitions will be included in the dll, if your using mingw to create the dll, as _myexport or, if your using ms visual c: myexport The import libraries (.a,.lib) will contain _myexport __imp__myexport in the case of mingw .a lib, and also .lib for ms visual c. These entries enable the compiler to resolve the linkage. A client of the library will, generally speaking, have the following declaration __declspec(dllimport) int myexport(int x); the object file created will reference __imp__myexport obviously if you have an object file with __imp__myexport and no import file you will not be able to resolve __imp__myexport to _myexport (or myexport) in the dll and ghci does not use import libraries but just searches for the symbols defined directly. It would be nice if ghci could directly resolve symbols decorated like __imp__ . what to do? Notice that the import libraries (for compilation) contain both symbols _myexport and __imp__myexport, therefore if you can get the haskell modules to reference the _myexport rather than __imp__myexport all will be ok both for ghci and also ghc compilation. so how did the __imp__ get there in the first place? notice the curl has the cabal option via-C, consequently the curl headers will be read in ... #if (defined(WIN32) || defined(_WIN32)) && !defined(CURL_STATICLIB) ... #define CURL_EXTERN __declspec(dllimport) ... i.e. by default curls sais link me to the dynamic library, if in the cabal file you define an option cc-options: -DCURL_STATICLIB then the but retain the link to the dynamic library Extra-libraries: curl where libcurl is the name of the dynamic import library ie libcurl.a (you need to rename libcurl.dll.a, libcurldll.a or whatever your import is called) as it needs to match the dll name as otherwise ghci will not find it eg libcurl.dll and that's it - all should work fine now! AN EXTRA NOTE ON IMPORT LIBRARIES on my system I like to have both the static import and the dynamic import libraries which are named libcurl.a (static) libcurl.dll.a (dynamic import) to make this work with both GHC and GHCI you need to do the following cabal ... Extra-libraries: curl.dll -- reference the dynamic import library, whatever name you have after building the package and installing (your versions will be different) ghc-pkg unregister curl-1.3.2.1 edit the dist\installed-pkg-config and add "extra-ghci-libraries: libcurl", or whatever the name of your .dll file is. Then run ghc-pkg update dist\installed-pkg-config what this will do, is tell ghci the dll name to search for, rather than relying on the name that you have specified with "Extra-libraries: curl.dll" the benefit of this process is that it will enable you to leave the names of your import libraries and dll files for curl untouched, which could otherwise break other dependencies you may have. The long and the short of it is --- much work still needs to be done to ensure that building and maintaining packages on windows platforms via cabal and ghc is painless - so far every package I have used that relied on external libraries has required some tweaking (and not just setting library paths). ----- Original Message ----- From: "Sigbjorn Finne" <sigbjorn.finne@gmail.com> To: "Martin Huschenbett" <huschi@gmx.org> Cc: "haskell" <haskell-cafe@haskell.org> Sent: Thursday, June 04, 2009 12:59 AM Subject: Re: [Haskell-cafe] GHCI & Curl under Windows
On Wed, 03 Jun 2009 05:27:53 -0700, Martin Huschenbett <huschi@gmx.org> wrote:
Hi Haskellers,
I've installed the newest Haskell Platform under Vista and downloaded a pre compiled version of curl-7.19.4 for MinGW. After changing the build type in curl.cabal to Simple and supplying the needed paths I could even build and install curl for haskell.
If I write a program using curl and compile it with GHC everything works fine. But if I try to execute the main function of my program in GHCI I always get the following error message:
Loading package curl-1.3.5 ... linking ... <interactive>: C:\Devel\Haskell\curl-1.3.5\ghc-6.10.3\HScurl-1.3.5.o: unknown symbol `__imp__curl_easy_getinfo': unable to load package `curl-1.3.5'
Did anybody have the same problem and knows how to fix it?
Hi Martin,
perhaps you already have, but did you go through this writeup
http://haskell.forkio.com/Home/curl-win32
and see if there are useful pointers there that might help?
--sigbjorn
-- Using Opera's revolutionary e-mail client: http://www.opera.com/mail/ _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe