Я пытаюсь собрать 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
функция или комментирование виртуального ключевого слова. Странно, но всегда есть ошибка / ошибки ссылки, которые говорят о vtable для ELJLog и ссылаются на wxLog :: DoLog, даже если 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
— РЕДАКТИРОВАТЬ —
Я работал над этим под 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/
Похоже определение
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);
}
Видя ваши шаги сборки сейчас, я не понимаю, почему вы создаете как статические, так и общие версии библиотек. Вы действительно нуждаетесь в них обоих? Обычно достаточно одного (обычно совместно используемого / DLL при создании расширений). Если вам нужны оба варианта, вам действительно следует создавать их в разных каталогах сборки, чтобы избежать странных проблем со сборкой из-за наличия файлов из старой сборки. Поэтому я бы посоветовал сделать следующее:
build_shared
подкаталог и запустить ../configure && make && make install
там.build_static
подкаталог в каталоге источников верхнего уровня и запустить ../configure --disable-shared && make && make install
там.Если что-то пойдет не так в будущем, вы всегда можете просто сделать rm -rf build_whatever
и создайте новый каталог сборки и перестройте там (cd build_whatever && make -s clean
работает тоже, но rm -rf
более удовлетворительно).
Оригинальный ответ ниже: он все еще может быть полезен кому-то еще, но, похоже, он не применим в вашем случае.
Возможно, вы создали wxWidgets без совместимости с 2.8. Он включен по умолчанию, поэтому убедитесь, что вы не использовали --disable-compat28
опция конфигурации (я думаю, это под Unix?).
Если wxLog::DoLog()
на самом деле есть в библиотеке (вы могли бы использовать nm
или же objdump
чтобы проверить это), то я бы проверил использование устаревших g ++ #pragma interface
а также #pragma implementation
Прагмы, как они могут привести к такой поломке IME. Если вы найдете их где-нибудь, просто удалите их полностью (но удалите оба из них, иначе у вас наверняка будут ошибки ссылок).