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

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

ただいまの
回答率

91.35%

  • Windows

    1009questions

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

  • Haskell

    43questions

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

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

解決済

回答 1

投稿 2017/11/28 22:23

  • 評価
  • クリップ 0
  • VIEW 100

sasakikj

score 1

前提・実現したいこと

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

該当のソースコード

module Main where

import Codec.Text.IConv
import Data.ByteString.Lazy
import Data.ByteString.Builder

main :: IO ()
main = 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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

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 ファイルを作成します。

resolver: lts-9.14
packages:
- '.'
- location:
    git: git@github.com:gzh/iconv.git
    commit: cfb368834e48938182457716183f542ddedbf7a0
  extra-dep: true

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

λ Get-ChildItem
    ディレクトリ: C:\Users\kazuki\Temp\encoding

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2017/11/29      0:12                app
-a----       2017/11/29      0:11            380 encoding.cabal
-a----       2017/11/29      0:39            161 stack.yaml
λ stack build
λ stack exec encoding-exe
[130,217,130,176]

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

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

投稿 2017/11/29 01:14

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/29 20:45

    とても丁寧な回答ありがとうございます!
    ご教示頂いた手順でビルドと実行が成功しました!

    >(Duncan Coutts <duncan@community.haskell.org>)にパッチを送るのがよいと思います。

    恥ずかしながら英語は苦手なのですが
    頂いた回答を基に、本家の方にパッチを送ってみます。

    本当にありがとうございました!

    キャンセル

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

ただいまの回答率

91.35%

関連した質問

  • 解決済

    opencvのcvConvertScaleAbs関数エラーを直したい

    こんにちは。 どうしても解決できず、ずっと悩んでいるのでご助力いただけないかと思い投稿しました。 前提・実現したいこと XcodeでC++、opencvを用いて行列操作を

  • 受付中

    Ironpythonでpythonのサードパーティライブラリを使う

    現在Visual Studio 2015 communityでvisual C#を用いて、Windows Form Applicationを作成しています。 そこで、データファイ

  • 解決済

    xsd:includeによるschemaLocationの設定について

    前提・実現したいこと 下記ディレクトリ構成のXSDファイル構成において schemaLocationに手を加えずに参照先を変え、 Antからのxjc実行によるJavaのクラス

  • 解決済

    N+1問題を解決したい

    前提・実現したいこと bulletを使ってN+1問題を直しています。 直していく中で、ActivityページのN+1問題でどのように直したらいいかわからなくって困っています。ど

  • 解決済

    公開されているデータベースシステムのビルドの方法

    やりたいこと とあるゲームのデータベースをいじりたいと思い、調べたらデータベースのシステムが公開されていました しかし、ビルドを行う方法がわからず困っています。 https:/

  • 解決済

    python-shogiの使い方

    python3(anaconda)にpython-shogiモジュールを入れて shogi.CSAを使いたいのですがエラーがでて使えません。どのようにすればよいのでしょうか sho

  • 解決済

    [Qt]Qtをクラス化する

    C++でやっています。 Qtを使ってみたいと思い、挑戦中です。 なにやら面倒くさいので Qtを簡略化するDLLを作成しようとしています。 ですが、Qtそのものを使い切れ

  • 解決済

    python pip がうまくいかない

    python の超初心者です。 pythonでpipを使って、numpyを入れるとこまでやりたいのですが、どこのサイトを見てもなかなかうまくいきません。 なにか、pythonをイン

同じタグがついた質問を見る

  • Windows

    1009questions

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

  • Haskell

    43questions

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