неопределенная ссылка на ошибку wxLog :: DoLog при построении wxHaskell против wxWidget 3.0

Я пытаюсь собрать 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/

2

Решение

Похоже определение

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);
}
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 более удовлетворительно).


Оригинальный ответ ниже: он все еще может быть полезен кому-то еще, но, похоже, он не применим в вашем случае.


Возможно, вы создали wxWidgets без совместимости с 2.8. Он включен по умолчанию, поэтому убедитесь, что вы не использовали --disable-compat28 опция конфигурации (я думаю, это под Unix?).

Если wxLog::DoLog() на самом деле есть в библиотеке (вы могли бы использовать nm или же objdump чтобы проверить это), то я бы проверил использование устаревших g ++ #pragma interface а также #pragma implementation Прагмы, как они могут привести к такой поломке IME. Если вы найдете их где-нибудь, просто удалите их полностью (но удалите оба из них, иначе у вас наверняка будут ошибки ссылок).

1

По вопросам рекламы [email protected]