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" <[email protected]>
To: "Martin Huschenbett" <[email protected]>
Cc: "haskell" <[email protected]>
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 <[email protected]> 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
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe


_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to