« perlでSQLite | メイン | 分離 »

2005年07月09日

Teaspire 開発日誌:: TJSをVC++でコンパイル

    

掲示板の書き込みに触発されて、TJSのVC++でのコンパイルを試してみることに。
とりあえず、吉里吉里 2.25 beta 5からTJSの部分のみコピーして、使い方のサンプルだけのソースを追加してビルドしてみることに。
デバッグオプションに__WIN32__を追加して、ワイド文字列の結合に悩む。
コメントを見るとBCC用のパッチ的な記述になっているようだが、VCでは通らない。
いろいろやるが出来ない。
使っているところを見ると、特になくても問題なさそうだが… 後他にもいろいろと修正を加えないといけなさそうなので面倒になって、掲示板に添付してあったソースをビルドしてみることに。
そしたら、SDLのヘッダーのいくつかが必要なようなので、SDLをダウンロードしてヘッダーをコピー。
ビルドが通る。
で、問題のコメントアウトしているというところを見て、コメントアウトをはずす。
よくわからないエラーが出る。
変換したい型が何なのかよくわからないので、STLのソースを追う。
ググる。
そしたら関係ないけど、boostのインストール方法を間違ってたのに気付く。
過去のboostのVC.NET 2003へのインストールを修正し、インストールしなおす。
でも、関係なし。
引数が1つの時はstd::mem_funではなく、std::mem_fun1じゃなかったかなぁと、std::mem_fun1に書き換えてみる。
エラーが変わって変換できない型が表示された。
関係ないところを省くと、どうやら__cdeclを__thiscallに変換できません。と言っているようだ。
__thiscallとstd::mem_funで調べてみるが、特に問題はない様子。
よくわからない。
メンバ関数ポインタに使われているメンバ関数に__cdeclを追加してみるが、エラーは変わらず。
ソースコードをよく見てみるとTJS_cdeclが付いている。
TJS_cdeclは、__declと定義されている。
これか!とTJS_cdeclを削除。
std::mem_fun1のエラーは解決したが、std::bind1stのエラーが出た。
あらら。
ちなみに、std::mem_funは引数の数を自動的に決めてくれるみたいで、std::mem_fun1じゃなくてもいい様子。
たぶん、std::mem_fun1の方が階層が浅いので、エラーメッセージがわかりやすい物だったのだろう。

std::bind1stのエラーは、『コンパイラ エラー C2535 'identifier' : メンバ関数は、既に定義または宣言されています。』。
このエラーは見たことがある気がする。
確かテンプレートを使っていた時だったような…
ヘルプを見るけどよくわからない。
grepしてみると、標準のSTLとboostの中で同じ物が見つかる。
競合しているのではないかと思ったが、そうではないような気がする。
一体なんだろう?



投稿者 Takenori : 2005年07月09日 22:03




comments powered by Disqus
Total : Today : Yesterday : なかのひと