質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Haskell

Haskellは高い機能性をもった関数型プログラミング言語で、他の手続き型プログラミング言語では難しいとされている関数でも容易に行うことができます。強い静的型付け、遅延評価などに対応しています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Q&A

解決済

1回答

6249閲覧

Haskellにてstackでiconvパッケージを利用する方法【Windows環境】

akiratto

総合スコア7

Haskell

Haskellは高い機能性をもった関数型プログラミング言語で、他の手続き型プログラミング言語では難しいとされている関数でも容易に行うことができます。強い静的型付け、遅延評価などに対応しています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

0グッド

0クリップ

投稿2017/11/28 13:23

###前提・実現したいこと
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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

sasakikj さんの調査通り、iconv パッケージは Windows で利用するには修正が必要なようです。

iconv パッケージの公式リポジトリーはこちらですが、そこからフォークして Windows で動くようにしたものが GitHub にありましたのでそちらを利用する方法を紹介します。

修正済みリポジトリーはこちらで、差分は下記です。

--- a/iconv.cabal +++ b/iconv.cabal @@ -30,5 +30,7 @@ library -- 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 + if os(windows) + extra-libraries: iconv-2 ghc-options: -Wall

コミットコメントによると下記の理由によるそうです。

This way it's usable on Windows with mingw and ghc-7.10.3.
libiconv-2.dll is taken from mingw that comes with ghc.
linking with libiconv.a does not work even when building
a binary, not to mention interactive mode where shared library
is the only viable option for linking with foreign code on windows.

さて、これを利用する方法ですが、作ろうとしている encoding パッケージの encoding.cabal のあるディレクトリーに下記のような stack.yaml ファイルを作成します。

stack.yaml

1resolver: lts-9.14 2packages: 3- '.' 4- location: 5 git: git@github.com:gzh/iconv.git 6 commit: cfb368834e48938182457716183f542ddedbf7a0 7 extra-dep: true

そして、下記のように stack build でビルドが成功し、stack exec encoding-exe で実行ができるはずです。(“λ” はプロンプトです。)

PowerShell

1λ Get-ChildItem 2 ディレクトリ: C:\Users\kazuki\Temp\encoding 3 4Mode LastWriteTime Length Name 5---- ------------- ------ ---- 6d----- 2017/11/29 0:12 app 7-a---- 2017/11/29 0:11 380 encoding.cabal 8-a---- 2017/11/29 0:39 161 stack.yaml 9λ stack build 10λ stack exec encoding-exe 11[130,217,130,176]

stack.yaml の意味ですが、packages. で encoding パッケージを指し、location の箇所で GitHub 上の特定のコミットを指定することで Stackage にある iconv パッケージよりもそちらを優先して利用するようにしています。

以上で、質問の回答になりますが、本来なら本家のライブラリーで対処してほしいところで、本家の方は Darcs でバージョン管理しているようでイシュートラッカーもないようですので、Hackage に掲載のメールアドレス(Duncan Coutts duncan@community.haskell.org)にパッチを送るのがよいと思います。

投稿2017/11/28 16:14

kakkun61

総合スコア285

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

akiratto

2017/11/29 11:45

とても丁寧な回答ありがとうございます! ご教示頂いた手順でビルドと実行が成功しました! >(Duncan Coutts <duncan@community.haskell.org>)にパッチを送るのがよいと思います。 恥ずかしながら英語は苦手なのですが 頂いた回答を基に、本家の方にパッチを送ってみます。 本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問