Russian Qt Forum

Qt => ActiveX => Тема начата: makes от Июнь 26, 2010, 02:30



Название: setVisible (undefined reference)
Отправлено: makes от Июнь 26, 2010, 02:30
Разобрался с сервером, теперь проблема с клиентом.
А именно, при сборке клиента выдается ошибка:
undefined reference to myLib::MyActiveX::setVisible.
Нэймспэйс myLib и класс MyActiveX сгенерированы dumpcpp'ом.

Как я понимаю, проблема в том, что в MyActiveX функция объявлена так:
Код:
inline void setVisible(bool p_visible);
а в его предке, QWidget, она виртуальна:
Код:
virtual void setVisible(bool visible);

Насколько я знаю, стандарт cpp не запрещает инлайнить виртуальные функции.
Так в чем проблема? как с этим бороться?


Название: Re: setVisible (undefined reference)
Отправлено: pastor от Июнь 26, 2010, 09:25
Цитировать
inline void setVisible(bool p_visible);

А где находится реализация этого метода?


Название: Re: setVisible (undefined reference)
Отправлено: makes от Июнь 26, 2010, 11:42
А где находится реализация этого метода?

Так в том же хедере, ниже:
Код:
inline void MyActiveX::setVisible(bool p_visible)
{
    void *_a[] = {0, (void*)&p_visible};
    qt_metacall(QMetaObject::InvokeMetaMethod, 57, _a);
}


Название: Re: setVisible (undefined reference)
Отправлено: makes от Июнь 26, 2010, 17:45
Понял откуда рога растут, однако проблему не решил.

dumpcpp сгененрировал два файла mylib.h и mylib.cpp.
В  mylib.cpp, перед иклюдом mylib.h, определен макрос, который отключает часть mylib.h, в котором определяются методы класса (объявлены они выше). Соответственно, определения, методов не видны в mylib.cpp, и отсюда ошибка:
debug/mylib.o:mylib.cpp:(.rdata$_ZTVN5mylib9MyActiveXE[vtable for mylib::MyActiveX]+0x3c): undefined reference to `mylib::MyActiveX::setVisible(bool)'.
Вопрос, почему отключено определение методов для mylib.cpp если компилятору (в данном случае g++) они там требуются?
Или это те самые "маленькие отличия" различных компиляторов от стандарта?
Что делать: менять dumpcpp или компилятор или что-то где-то настроить можно?


Название: Re: setVisible (undefined reference)
Отправлено: makes от Июнь 27, 2010, 23:25
"... четвертые сутки пылают станицы ..."  ;D
(извините, это нервное)

Что делать: менять dumpcpp или компилятор или что-то где-то настроить можно?

Ответ (сам себе отвечаю ;) ): менять компилятор!
Сменил компилер на VC2008, и, о!, приложение собралось!!! (т.е. dumpcpp не под все компиляторы заточен)
И все равно - жопа!!! (чуть не выругался) Подробности здесь:
http://www.prog.org.ru/topic_14104_0.html