在Windows上将c ++ dll与Haskell-Platform链接,输出'undefined reference'

Rij*_*ijk 5 gcc haskell mingw iconv

我是Haskell的狂热爱好者,并且一直坚持在Windows上编译我的小Haskell程序.我的程序使用iconv包,后者又使用用c/c ++编写的外部库.为了让事情有效我有:

  • 运行GNU-Iconv设置并将'bin'文件夹添加到PATH 变量中,其中'libiconv-2.dll'和'libiconv2.dll'位于该文件夹中.
  • 将"LibIconv开发人员文件"提取并复制到Haskell平台位置的"mingw"文件夹中.
  • 然后'cabal install iconv'编译,我安装了cabal包.

现在,当我尝试在Leksah中构建我的模块时,我从'GHC'获得以下消息:

Building norms-parser-0.0.1...
Linking dist\build\norms-parser\norms-parser.exe ...
C:\Documents and Settings\kdv\Application Data\cabal\iconv-0.4.1.0\ghc-7.0.4/libHSiconv-0.4.1.0.a(hsiconv.o):hsiconv.c:(.text+0x7): undefined reference to `_imp__libiconv_open'
C:\Documents and Settings\kdv\Application Data\cabal\iconv-0.4.1.0\ghc-7.0.4/libHSiconv-0.4.1.0.a(hsiconv.o):hsiconv.c:(.text+0x17): undefined reference to `_imp__libiconv'
C:\Documents and Settings\kdv\Application Data\cabal\iconv-0.4.1.0\ghc-7.0.4/libHSiconv-0.4.1.0.a(hsiconv.o):hsiconv.c:(.text+0x27): undefined reference to `_imp__libiconv_close'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

有了'GHCi',我也面临一个问题:

ghc.exe: unable to load package `iconv-0.4.1.0'
ghc.exe: C:\Documents and Settings\kdv\Application Data\cabal\iconv-0.4.1.0\ghc-    7.0.4\HSiconv-0.4.1.0.o: unknown symbol `__imp__libiconv_open'
Run Code Online (Sandbox Code Playgroud)

我认为可能的解决方案是将c/c ++头文件正确设置为'mingw'文件夹并将PATH变量设置为'lib'文件,但我对它知之甚少,所以任何帮助都将非常感激.

Rij*_*ijk 1

在 Windows 上安装 libiconv 有点棘手。

  1. 此处下载 libiconv二进制文件开发人员文件
  2. 将这两个包解压到 mingw 文件夹中,该文件夹位于 Haskell Platform 文件夹内。
  3. 暂时下载Iconv最新版本的cabal包
  4. 编辑 iconv.cabal 文件,因此与include-dirsextra-lib-dirswill 的行看起来像

    include-dirs:    cbits, "C:\\HaskellPlatform\\2013.2.0.0\\mingw\\include"
    extra-lib-dirs:  "C:\\HaskellPlatform\\2013.2.0.0\\mingw\\lib"
    
    Run Code Online (Sandbox Code Playgroud)

注意 Windows 路径中的双破折号,并将其编辑为您的 Haskell Platform 路径。

  1. 编辑 iconv.cabal 文件,有一行带有if os(darwin) || os(freebsd),将其更改为if os(darwin) || os(freebsd) || os(windows)
  2. 就是这样,现在您可以cabal install从 iconv pachage dir 运行命令