wxWidgets 3.0 用に wxHaskell をビルドしようとしています。https://github.com/wxHaskell/wxHaskellの wxHaskell の最新の git バージョンを使用しました。
install.txt
wxHaskell-master.zipをフォローしようとしましたが、これまでに行ったことは次のとおりです。
cd wxdirect
cabal install
cd ../wxc
cabal install
wxc
Setup.hs が wxWidgets 2.9 を必要とするため、コンパイルできません。交換しました
let wxRequiredVersion = "2.9"
と
let wxRequiredVersion = "3.0"
そして、次のことを行いました:
cabal install --extra-lib-dirs=/usr/local/lib
すべてのコンパイルは問題なく行われましたが、最終的にいくつかのリンク エラーが発生しました。解決するのが最も難しいのは次のとおりです。
dist\build\src\cpp\eljlog.o:eljlog.cpp:(.rdata$_ZTV6ELJLog[vtable for ELJLog]+0x20): undefined reference to `wxLog::DoLog(unsigned long, char const*, long)'
対応するソース コードは次のwxc/src/cpp/eljlog.cpp
とおりです。
class ELJLog : public wxLog
{
private:
TLogFunc func;
void* EiffelObject;
protected:
virtual void DoLog(wxLogLevel level, const wxChar *szString, time_t t)
{
wxString s(szString);
func (EiffelObject, (int)level, (void*)&s , (int)t);
}
....
このエラーの原因と修正方法がわかりませんでした。この問題について調査したところvtable
、子クラスで仮想関数を定義せずに宣言したことが原因であると示唆する人もいました。他の人は、オブジェクト ファイルが g++ コマンド ラインで指定される順序であると提案しました。しかし、ここではどちらも当てはまらないようです。関数関数を削除するELJLog::DoLog
か、仮想キーワードをコメントアウトしてみました。奇妙なことに、DoLog が発生していない場合でも、ELJLog の vtable に関する何かを示すリンク エラー/エラーが常にあり、wxLog::DoLog を参照します。
また、補足としてwxLog::DoLog
、wxWidgets 3.0 のドキュメントには記載されていないようです。この機能が非推奨かどうかはわかりません。それでも、理解できない方法でレガシー派生クラスのエラーが発生しています。
ここで何が起こっているのですか?
--- EDIT2 ---
問題の関数をコメントアウトすると
virtual void DoLog(wxLogLevel level, const wxChar *szString, time_t t) ...
次のように、さまざまなリンク エラーが発生しました。
dist\build\src\cpp\eljlog.o:eljlog.cpp:(.rdata$_ZTV6ELJLog[vtable for ELJLog]+0x
20): undefined reference to `wxLog::DoLog(unsigned long, char const*, long)'
dist\build\src\cpp\eljlog.o:eljlog.cpp:(.rdata$_ZTV6ELJLog[vtable for ELJLog]+0x
24): undefined reference to `wxLog::DoLog(unsigned long, wchar_t const*, long)'
collect2: ld returned 1 exit status
- - 編集 - -
私は mingw.org の mingw32 の下でこれに取り組みました。ソースから wxWidgets 3.0.0 安定リリースをビルドしました。実行した手順は次のとおりです。
per http://mingw.5.n7.nabble.com/win32api-version-4-td32288.html :
edit line 2217 of /c/mingw/{,mingw32/}include/commctrl.h to read
#define TV_DISPINFO NMTVDISPINFO
instead of
#define TV_DISPINFO __AW(NMTVDISPINFO)
The above was needed to fix a MinGW32 4.8.1-4 issue. Then,
./configure --enable-stl --disable-shared
make
make install
./configure --enable-stl
make
make install
mv /usr/local/lib/wx*.dll /c/mingw/bin/