137: iconvの引数のコンパイルエラー


最新状況

タイトル iconvの引数のコンパイルエラー
状態 完了
カテゴリ その他
作成日時 2009-01-18 13:38:40
最終更新日時 2010-03-20 01:36:42

履歴

1 | 2009-01-18 13:38:40 | 提案
shinshin319 at yahoo.co.jp
onscripter-20090116.tar.gz
i386-mingw32 (Windows)

この環境でONScripterをコンパイルしたとき
以下のコンパイルエラーが発生します。

>DirectReader.cpp: In static member function `static void DirectReader::convertFromSJISToUTF8(char*, const char*, size_t)':
>DirectReader.cpp:411: error: invalid conversion from `const char**' to `char**'
>DirectReader.cpp:411: error:   initializing argument 2 of `size_t libiconv(void*, char**, size_t*, char**, size_t*)'
>make[1]: *** [DirectReader.o] Error 1

iconv関数がchar**を要求しているところにconst char**を与えていることが原
因のようです。

DirectReader.cppの411行目のこの部分

 int ret = iconv(iconv_cd, &src_buf, &src_len, &dst_buf, &dst_len);

const char**のsrc_bufをchar**でキャストしたところ

 int ret = iconv(iconv_cd, (char**)&src_buf, &src_len, &dst_buf, &dst_len);

コンパイルが通るようになりました。

2 | 2009-01-18 23:14:03 | 受付済
ogapee at aqua.dti2.ne.jp
ご報告ありがとうございます。

> const char**のsrc_bufをchar**でキャストしたところ
> 
>  int ret = iconv(iconv_cd, (char**)&src_buf, &src_len, &dst_buf, &dst_len);
> 
> コンパイルが通るようになりました。

ただ、こうするとこちらの Windows 環境
* Visual Studio 2008 C++
* iconv-1.8 (http://www.meadowy.org/meadow/dists/snapshot/old/iconv-1.8.win32.zip)
では逆にエラーになってしまいます。

DirectReader.cpp(411) : error C2664: 'libiconv' : 2 番目の引数を 'char 
**' から
'const char **' に変換できません。(新しい機能 ; ヘルプを参照)
        変換で修飾子が失われます。


どうも、iconv をビルドして iconv.h とライブラリを生成するときに、2番目
の引数に const が付く場合と付かない場合があるようです。

上記の iconv-1.8 のヘッダでは、
extern LIBICONV_DLL_EXPORTED size_t iconv (iconv_t cd, const char* * 
inbuf, size_t *inbytesleft, char* * outbuf, size_t *outbytesleft);
と定義されています。

一方 Linux の libc6 (2.3.6.ds1-13etch8) 付属の iconv.h では、
extern size_t iconv (iconv_t __cd, char **__restrict __inbuf,
                     size_t *__restrict __inbytesleft,
                     char **__restrict __outbuf,
                     size_t *__restrict __outbytesleft);
となっています。

どうしたらよいか、悩ましいところです。

3 | 2010-01-22 22:36:31 | 受付済
logue at hotmail.co.jp
> ご報告ありがとうございます。
> 
> > const char**のsrc_bufをchar**でキャストしたところ
> > 
> >  int ret = iconv(iconv_cd, (char**)&src_buf, &src_len, &dst_buf, &dst_len);
> > 
> > コンパイルが通るようになりました。
> 
> ただ、こうするとこちらの Windows 環境
> * Visual Studio 2008 C++
> * iconv-1.8 (http://www.meadowy.org/meadow/dists/snapshot/old/iconv-
> 1.8.win32.zip)
> では逆にエラーになってしまいます。
> 
> DirectReader.cpp(411) : error C2664: 'libiconv' : 2 番目の引数を 'char 
> **' から
> 'const char **' に変換できません。(新しい機能 ; ヘルプを参照)
>         変換で修飾子が失われます。
> 
> 
> どうも、iconv をビルドして iconv.h とライブラリを生成するときに、2番目
> の引数に const が付く場合と付かない場合があるようです。
> 
> 上記の iconv-1.8 のヘッダでは、
> extern LIBICONV_DLL_EXPORTED size_t iconv (iconv_t cd, const char* * 
> inbuf, size_t *inbytesleft, char* * outbuf, size_t *outbytesleft);
> と定義されています。
> 
> 一方 Linux の libc6 (2.3.6.ds1-13etch8) 付属の iconv.h では、
> extern size_t iconv (iconv_t __cd, char **__restrict __inbuf,
>                      size_t *__restrict __inbytesleft,
>                      char **__restrict __outbuf,
>                      size_t *__restrict __outbytesleft);
> となっています。
> 
> どうしたらよいか、悩ましいところです。

普通にビルドできますよ。
iconvは公式のものを使っていますか?
http://file.logue.be/dl/f/Ahx46uoJgg

4 | 2010-02-01 02:01:16 | 受付済
ogapee at aqua.dti2.ne.jp
コメントありがとうございます。

試していないので推測ですが、MinGW 環境では iconv をビルドする過程で自動生成される
 iconv.h 内の iconv() 関数の第2引数の型が char ** になるのではないでしょうか。

ところが、ONScripter のページからリンクを張っている iconv DLL のバイナリ配布内の 
iconv.h では、第2引数が const char ** となっています。

以下で配布されているバイナリ配布でも同様です。
http://www.kaoriya.net/

Visual Studio C++ で ONScripter を使用される方は、上記の iconv バイナリをダウンロ
ードして使用される方が多数だと思うため、ちょっと対応しかねています。

#探せば iconv() の第2引数が char ** となっているバイナリ配布があるかもしれませ
んが…

5 | 2010-03-17 15:46:28 | 受付済
shinshin319 at yahoo.co.jp
iconvはソースコードからビルドしたものを使用していました。
使用したのは「libiconv-1.12.tar.gz」です。

> 試していないので推測ですが、MinGW 環境では iconv をビルドする過程で自動生成される
>  iconv.h 内の iconv() 関数の第2引数の型が char ** になるのではないでしょうか。

はい。そのようです。
ONScripterで想定しているiconv.hでは第2引数が const char **なので、
問題のある環境でのみ個別に修正するということでよいかと思います。

iconvをソースコードからビルドして使用したのは
全てのライブラリを静的リンクすると
(1)実行ファイル1つで済む
(2)ライブラリのバージョン不一致による不具合がおきない
ため、ユーザが利用するときに楽だと思ったからです。

6 | 2010-03-17 15:48:31 | 受付済
shinshin319 at yahoo.co.jp
iconvをソースコードからビルドして使用したのは
静的リンクライブラリを作るためです。

全てのライブラリを静的リンクすると
(1)実行ファイル1つで済む
(2)ライブラリのバージョン不一致による不具合がおきない
ため、ユーザが利用するときに楽だと思ったのです。

7 | 2010-03-20 01:36:42 | 完了
ogapee at aqua.dti2.ne.jp
お返事ありがとうございます。

本件は、エラーになる環境では個別に対応していただくということで、完了とさせていた
だきます。

もし対応することが難しい場合がありましたら、別途ご報告ください。

リプライをつける

送信者*
送信者のメールアドレスを入力してください。
タイトル*
この報告の概要を簡潔・明瞭に書いてください。
「動きません」「わかりません」「質問です」などの題名は不適切です。
カテゴリ バグ 追加機能 ドキュメント その他
内容*
簡潔・明瞭にどうぞ。余分な引用や挨拶はいりません。
添付ファイル (1500Kバイトまで)
ファイル名とファイルの種類を指定してください。日本語のファイル名はやめておいた方が無難です。
オプション リプライをメールで受け取る。
チェックを外してください。
Cookieを使って {送信者} の保存を行う。
*がついた項目は必須項目です。

Bug Tracking System 影舞 0.8.8
Powered by Ruby 1.8.7