[Haskell-cafe] GHCI & Curl under Windows
John Lask
jvlask at hotmail.com
Wed Jun 3 22:57:45 EDT 2009
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 at gmail.com>
To: "Martin Huschenbett" <huschi at gmx.org>
Cc: "haskell" <haskell-cafe at 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 at 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 at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
More information about the Haskell-Cafe
mailing list