Я пытаюсь собрать wxHaskell для wxWidgets 3.0. Я использовал последнюю версию git wxHaskell из https://github.com/wxHaskell/wxHaskell.
Я попытался следовать 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
или закомментировать ключевое слово virtual. Как ни странно, всегда есть ошибка/ошибки ссылки, говорящие что-то о vtable для ELJLog и ссылающиеся на wxLog::DoLog, даже если DoLog не встречается.
Кроме того, в качестве примечания, wxLog::DoLog
, кажется, отсутствует в документации wxWidgets 3.0. Я не уверен, устарела ли эта функция или нет. Но тем не менее, это вызывает ошибки для устаревших производных классов, что я не могу понять.
Любые идеи, что здесь происходит?
--- РЕДАКТИРОВАТЬ2 ---
Если я закомментирую рассматриваемую функцию
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
--- РЕДАКТИРОВАТЬ ---
Я работал над этим под mingw32 с mingw.org. Я собрал стабильную версию 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/