2

wxWidgets 3.0 用に wxHaskell をビルドしようとしています。https://github.com/wxHaskell/wxHaskellの wxHaskell の最新の git バージョンを使用しました。

install.txtwxHaskell-master.zipをフォローしようとしましたが、これまでに行ったことは次のとおりです。

cd wxdirect
cabal install
cd ../wxc
cabal install 

wxcSetup.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/
4

2 に答える 2

1

の定義らしい

virtual void DoLog(wxLogLevel level, const char *szString, time_t t)

のサブクラスELJLogにがありませんwxLog。インターフェイスが異なる次のコピーを追加するとDoLog、問題が解決するだけです。

virtual void DoLog(wxLogLevel level, const char *szString, time_t t)
{
    wxString s(szString);
    func (EiffelObject, (int)level, (void*)&s , (int)t);
}
于 2014-03-13T11:08:31.510 に答える
1

ビルド手順を見て、ライブラリの静的バージョンと共有バージョンの両方をビルドする理由がわかりません。本当に両方必要ですか?通常は 1 つだけ (通常、拡張機能をビルドする場合は共有/DLL) で十分です。両方が必要な場合は、古いビルドのファイルが原因で発生する奇妙なビルドの問題を回避するために、異なるビルド ディレクトリにそれらをビルドする必要があります。したがって、次のことをお勧めします。

  1. 既存のソースを完全に削除します。
  2. それらを新たに入手してください(そしてMinGW修正を適用してください)。
  3. サブディレクトリを作成し、そこでbuild_shared実行../configure && make && make installします。
  4. これで十分でない場合、つまり静的ライブラリも本当に必要な場合build_staticは、最上位のソース ディレクトリのサブディレクトリを作成し、../configure --disable-shared && make && make installそこで実行します。

将来何か問題が発生した場合は、いつでもrm -rf build_whatever新しいビルド ディレクトリを作成してそこに再構築することができます (cd build_whatever && make -s cleanこれも機能しますが、rm -rfより満足のいくものです)。


以下の元の回答:他の人にはまだ役立つ可能性がありますが、あなたの場合には当てはまらないようです。


1 つの可能性は、2.8 互換性なしで wxWidgets をビルドしたことです。これはデフォルトでオンになっているので、configure オプションを使用していないことを確認してください--disable-compat28(これは Unix にあると思いますか?)。

wxLog::DoLog()ライブラリに実際に存在する場合(nmまたはobjdumpこれを確認するために使用できます)、廃止されたg ++#pragma interface#pragma implementationプラグマの使用を確認します。これらはIMEの破損につながる可能性があります。どこかにそれらが見つかった場合は、それらを完全に削除してください (ただし、両方とも削除してください。そうしないと、リンク エラーが確実に発生します)。

于 2014-03-05T15:51:23.327 に答える