###前提・実現したいこと
Windows環境でHaskellのiconvパッケージを使って
文字コード変換を行うプログラムを作りたいと考えています。
stackを使ってiconvパッケージのインストールは成功したのですが
このiconvを使用したプログラムをビルドするとエラーが発生し、
ビルドに失敗してしまいました。
###発生している問題・エラーメッセージ
C:\develop\haskell\encoding3>stack build encoding-0.1.0.0: build (exe) Preprocessing executable 'encoding-exe' for encoding-0.1.0.0... Linking .stack-work\dist\ca59d0ab\build\encoding-exe\encoding-exe.exe ... C:\sr\snapshots\518da490\lib\x86_64-windows-ghc-8.0.2\iconv-0.4.1.3-I85O545vzBcKCsc6STHSc0/libHSiconv-0.4.1.3-I85O545vzBcKCsc6STHSc0.a(hsiconv.o):hsiconv.c:(.text+0x1): `libiconv_open' に対する定義されていない参照です C:\sr\snapshots\518da490\lib\x86_64-windows-ghc-8.0.2\iconv-0.4.1.3-I85O545vzBcKCsc6STHSc0/libHSiconv-0.4.1.3-I85O545vzBcKCsc6STHSc0.a(hsiconv.o):hsiconv.c:(.text+0x11): `libiconv' に対する定義されていない参照です C:\sr\snapshots\518da490\lib\x86_64-windows-ghc-8.0.2\iconv-0.4.1.3-I85O545vzBcKCsc6STHSc0/libHSiconv-0.4.1.3-I85O545vzBcKCsc6STHSc0.a(hsiconv.o):hsiconv.c:(.text+0x21): `libiconv_close' に対する定義されていない参照です collect2.exe: error: ld returned 1 exit status `gcc.exe' failed in phase `Linker'. (Exit code: 1) -- While building package encoding-0.1.0.0 using: C:\sr\setup-exe-cache\x86_64-windows\Cabal-simple_Z6RU0evB_1.24.2.0_ghc-8.0.2.exe --builddir=.stack-work\dist\ca59d0ab build exe:encoding-exe --ghc-options " -ddump-hi -ddump-to-file" Process exited with code: ExitFailure 1
###該当のソースコード
haskell
1module Main where 2 3import Codec.Text.IConv 4import Data.ByteString.Lazy 5import Data.ByteString.Builder 6 7main :: IO () 8main = print $ unpack $ convert "UTF-8" "Shift_JIS" (toLazyByteString $ stringUtf8 "ほげ")
###Cabalファイルの設定
executable encoding-exe hs-source-dirs: app main-is: Main.hs ghc-options: -threaded -rtsopts -with-rtsopts=-N build-depends: base , bytestring , iconv default-language: Haskell2010
###試したこと
調べたところ、下記のURLによるとstackageにあるiconvのcabalファイルには外部ライブラリであるiconvのヘッダーファイルとライブラリを
指定する項目がないことが原因とありました。
https://github.com/commercialhaskell/stack/issues/1767
そこで次の2つを試してみました。
1.stack.yamlにヘッダファイルとライブラリを指定
extra-include-dirs: - C:\Users\Owner\AppData\Local\Programs\stack\x86_64-windows\ghc-8.0.2\mingw\include extra-lib-dirs: - C:\Users\Owner\AppData\Local\Programs\stack\x86_64-windows\ghc-8.0.2\mingw\lib
設定後、stack buildを実行しましたが同じエラーでビルドに
失敗しました。
2.iconvパッケージをダウンロードしてCabalファイルを修正
自プロジェクトにiconvパッケージのソースを配置し
cabalファイルに以下の設定を追加しビルド。
library exposed-modules: Lib.Codec.Text.IConv other-modules: Lib.Codec.Text.IConv.Internal build-depends: base >= 3 && < 5, bytestring == 0.9.* || ==0.10.* extensions: ForeignFunctionInterface includes: hsiconv.h include-dirs: Lib/cbits, C:\Users\Owner\AppData\Local\Programs\stack\x86_64-windows\ghc-8.0.2\mingw\include extra-lib-dirs: C:\Users\Owner\AppData\Local\Programs\stack\x86_64-windows\ghc-8.0.2\mingw\lib c-sources: Lib/cbits/hsiconv.c if os(darwin) || os(freebsd) || os(windows) -- on many systems the iconv api is part of the standard C library -- but on some others we have to link to an external libiconv: extra-libraries: iconv ghc-options: -Wall
従来のCabalファイルとの変更点は
・include-dirs、extra-lib-dirsにパスを追加
・「os(windows)」を追加
です。
ビルドは成功し、実行は正常にできましたが
stackにパッケージがあるのに
手動でダウンロードしなければならないのが気になります。
stackだけでうまくiconvパッケージを利用する方法は
ないのでしょうか?
宜しくお願いします。
###補足情報(言語/FW/ツール等のバージョンなど)
OS: Windows 10 Pro 64bit
Haskell: Haskell Platform 8.2.1
stack: Version 1.5.1, Git revision 600c1f01435a10d127938709556c1682ecfd694e x86_64 hpack-0.17.1
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/29 11:45