-
Notifications
You must be signed in to change notification settings - Fork 163
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
MinGWビルドのエラーに対処する #559
MinGWビルドのエラーに対処する #559
Conversation
msvcではvoid*にポインタ型を代入するときにキャストを書かなくても変換できる。 gccではvoid*への代入であってもキャストが必要っぽい。 とりあえずキャストを書いておけばビルドは通るが、正攻法があるような気もする。
プロパティシート用の構造体サイズPROPSHEETHEADER_V2_SIZEの定義が壊れている? 構造体の定義自体は正しいようなのでsizeofで書き換えればビルドはできる。 該当箇所を示すためにとりあえず該当箇所を修正してあるが、 PROPSHEETHEADER_V2_SIZEを再定義する作戦にすれば修正は一か所で済み、今後プロパティシートが増えても影響ない。 どうするべきか微妙。
TagIterator::eachの引数(非const lvalue&)に対して関数の戻り値(rvalue)を指定しているのが怒られている。 対策としてはeachの引数をconstにするか、rvalueにするか。 修正量はrvalueにするほうが少ないのでとりあえずrvalueにしてみた。
ビルドが走らんのでWIP外しました。 内容的にはこのままマージしてもいいはずなんで、いいか、と。 |
sakura_core/prop/CPropCommon.cpp
Outdated
@@ -260,8 +260,8 @@ INT_PTR CPropCommon::DoPropertySheet( int nPageNum, bool bTrayProc ) | |||
} | |||
// To Here Jun. 2, 2001 genta | |||
|
|||
PROPSHEETHEADER psh = { PROPSHEETHEADER_V2_SIZE }; | |||
psh.dwSize = PROPSHEETHEADER_V2_SIZE; | |||
PROPSHEETHEADER psh = { sizeof(PROPSHEETHEADER) }; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
PROPSHEETHEADER_V2_SIZE が壊れているというのは具体的にどういうことですか?
この修正を入れない場合はどんなエラーが出ますか?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
sizeof(PROPSHEETHEADER)
を使うことのデメリットは、将来的に
この構造体が拡張されて、ヘッダ定義が変わると新しいSDKヘッダで
コンパイルするとコードの振る舞いが変わってしまうことです。
MinGW のコンパイルを通すために VC 側を変えてしまうのはよろしくないと思います。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
MinGW-w64 を使っていれば PROPSHEETHEADER_V2_SIZE
は定義されているはずですが、古い MinGW では定義されていないようです。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
あとでログ付けます。
シンボル定義自体は存在しているのですが、Windows SDKの定義方法と違っていて「未定義のメンバを参照している」的なエラーが出ます。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ローカルビルドで確認したエラーメッセージは次の通りです。
In file included from D:/eclipse4.7/eclipse/mingw/x86_64-w64-mingw32/include/winspool.h:12:0,
from D:/eclipse4.7/eclipse/mingw/x86_64-w64-mingw32/include/Windows.h:102,
from _main/global.h:29,
from StdAfx.h:42:
prop/CPropCommon.cpp: In member function 'INT_PTR CPropCommon::DoPropertySheet(int, bool)':
prop/CPropCommon.cpp:263:26: error: 'PROPSHEETHEADERW {aka struct _PROPSHEETHEADERW}' has no member named 'DUMMYUNION5_MEMBER'
PROPSHEETHEADER psh = { PROPSHEETHEADER_V2_SIZE };
おそらく 'PROPSHEETHEADERW {aka struct _PROPSHEETHEADERW}' has no member named 'DUMMYUNION5_MEMBER'
という部分がエラー原因です。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
確かにMinGWのヘッダーが壊れているようですね。このエラーからすると、
#ifndef NONAMELESSUNION
#define DUMMYUNION5_MEMBER(x) x
#else /* NONAMELESSUNION */
#define DUMMYUNION5_MEMBER(x) DUMMYUNIONNAME5.x
#endif
こんな感じの定義がどこか(_mingw.hやwinnt.h辺り?)に必要なはずですが見当たりませんね。
どこかに自前で定義したら通りますかね?
// Workaround for PROPSHEETHEADER_V2_SIZE
#if defined(__MINGW__) && !defined(DUMMYUNION5_MEMBER)
#ifndef NONAMELESSUNION
#define DUMMYUNION5_MEMBER(x) x
#else /* NONAMELESSUNION */
#define DUMMYUNION5_MEMBER(x) DUMMYUNIONNAME5.x
#endif
#endif
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@k-takata さん
どこかに自前で定義したら通りますかね?
ローカルでやってみたら通りました。 -> fbb7f8f
本家にあたる宣言は確認できませんでしたが、元ネタっぽいものは見付けました。
(最後の方に1~5の定義がある)
http://en.verysource.com/code/281895_1/priv.h.html
どっかからコピってきた雰囲気なので、本家は別っぽいです。
DUMMYUNION5_MEMBER
でググると mingw-w64 の prsht.h を取り込んだものがヒットするので、過去のどっかの時点までは生きていた実装なのかな、と思ってます。GitHubにあるMinGWのミラーで検索してみると DUMMYUNION5_MEMBER
の利用箇所はここだけっぽいです・・・
https://github.com/mirror/mingw-w64/search?q=DUMMYUNION5_MEMBER&unscoped_q=DUMMYUNION5_MEMBER
3つ目のエラーのログがこれです。
おそらく 非constなlvalue参照とrvalueを関連付けることができませんでした、的な意味です。 |
const をつけるのが自然なら const をつける対応でお願いしたいです。 |
設計的に非constな引数が欲しい場面です。 修正箇所 ( |
MinGW-gccのエラー解析で邪魔になるので対処しておく。 警告の原因はmsvcとgccでNULLの定義が異なるため。 * msvcのNULLは0(数値) * gccのNULLはnullptr(nullptr_t)
This reverts commit 2d61954.
MinGWのprsht.hに含まれるDUMMYUNION5_MEMBERマクロを独自定義する。 元定義の出所は不詳。 http://en.verysource.com/code/281895_1/priv.h.html に近い定義がある。
一個追加で警告対策のコミットを混ぜました。f1f3320 appveyorのMinGWビルドも通ったようなので再レビューをお願いします。 |
DUMMYUNION 関連の定義は winnt.h や _mingw.h の中でされているので、最初にいずれかのファイルが読み込まれた後に、例の定義を追加するべきだと思います。 |
@k-takata さん
ログ貼ったやつがリベースで消えたっぽいのでもう一回貼ります。
対応差し替えで挿入した位置は |
ああそうなると、以前のように _mingw.h を明示的にインクルードして、その後に入れた方がいいかもしれませんね。たとえ本家が修正されて なので、こんなのはどうでしょうか。(indentした方がよさげ?) // Workaround for PROPSHEETHEADER_V2_SIZE
#ifdef __MINGW__
#include <_mingw.h>
#ifndef DUMMYUNION5_MEMBER
#ifndef NONAMELESSUNION
#define DUMMYUNION5_MEMBER(x) x
#else /* NONAMELESSUNION */
#define DUMMYUNION5_MEMBER(x) DUMMYUNIONNAME5.x
#endif
#endif
#endif
|
ではそんな感じで行きますw うちの環境(eclipse4.6.3)だと
win8.1+IE11だとOutdatedのリンクをクリックしても表示されなかったのです...orz |
user名がmirrorなので完全な第3者がやってそうな雰囲気。 |
http://mingw-w64.org/doku.php/contribute |
まったく関係ない話ですがこれが気になりました。
gcc on Windowsにかけられた borland の呪いはとっくに解けていたんですね・・・。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
この PR が未だマージされていないことに驚いてしまいました。MinGW ビルドが通らないのでとりあえず入れてしまって、その後の問題は起きてから考えてもいいと思います。
@berryzplus さんへ、予告です。 MinGW でテストをビルドすると |
自分で何個かテスト書いて知ってて、
やってみたことがないことは断言できんので、フタを開けてみたら意外と大変かも知れないのが懸念です。 |
MinGWはmsvcrt.dllを使用しますが、VCのprintf系関数は規格への準拠度が低いため、printf系関数はMinGW独自のものを使用することができるようになっています。 |
テストコードだから凝ったことをせずに同じ引数を並べたり、長ーいリテラルを埋め込んでもいいと思うんですけど、他人のコードなのでお任せします。 |
以下のエラーになりました。
|
何か残件ありますか? |
残件はないと思います。 テストコードまで含めるとまだ対応しないといけないことがあるのが分かってますが、それば別件なので。
・・・言葉足らずでした。 そのエラーは「constインスタンスからはconst じゃない operator () を呼べないよ」という意味です。 単純に「operator()」を「operator() const」にしてやれば、このエラー自体は解消します。 どうなるかを知るには実際やってみるのが早いので、「やってみれば分かる」と書きました。 無理だ、と思うリファクタリングを強行してみるのも、意外と楽しいものだと思います。 |
対応しないといけない件を別 issue で作成していただけますか? |
質問です。 master はこの PR なしでもビルド通ってるんですよね? |
master の MinGW ビルドが現在も途中で止まっています。 https://ci.appveyor.com/project/sakuraeditor/sakura/branch/master/job/p3fngivmfmrtaek1
よく考えれば、それなのに「Build success」としてグリーンになるのがおかしい状態ですね。 |
マージしました。 |
…void_ptr MinGWビルドのエラーに対処する
#548 (comment)
ビルドエラーの原因を確認しました。
どう対処すべきかが微妙な原因ばかり3件ありました。
それぞれ「どうすればビルドが通るか」の方法は見付けています。
見つけた対策それぞれにコメント書いておきますので、
こうした方がいい、とかあればご意見ください。
(実際にマージするときはコミットコメントを変えると思います。)