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

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

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

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

Windows

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

解決済

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

akiratto
akiratto

総合スコア7

Haskell

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

Windows

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

1回答

0リアクション

0クリップ

4882閲覧

投稿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

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ページの「注目」タブのフィードに表示されやすくなります。

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

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

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

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

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

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

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

Haskell

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

Windows

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