Russian Qt Forum

Qt => Общие вопросы => Тема начата: nik135 от Февраль 16, 2009, 22:55



Название: Вопрос к знатокам Qt и компиляторов
Отправлено: nik135 от Февраль 16, 2009, 22:55
Есть следующая проблема: нужно использовать виджет от qt4 в qt3. Обе библиотеки существуют на машине параллельно и используют каждая свои glibc, g++ и т.д.
Для решения задачи создаю библиотеку  средствами qt4 и в ней же создаю объект QApplication. Потом к этой библиотеке линкуюсь из qt3. Все компилируется, но не пашет :-( Валится в сегфолт  >:(

Подскажите, нормально ли существование двух QApplication?(один из qt3, другой в библиотке qt4)
Ах, да, забыл написать, Linux.

Жду умных мыслей :)


Название: Re: Вопрос к знатокам Qt и компиляторов
Отправлено: Rain от Февраль 17, 2009, 00:43
Подскажите, нормально ли существование двух QApplication?(один из qt3, другой в библиотке qt4)

А как такое вообще может быть, два QApplication? Event loop ведь запускается...


Название: Re: Вопрос к знатокам Qt и компиляторов
Отправлено: ритт от Февраль 17, 2009, 02:13
создавать сущность QApplication в либе - нонсенс.
смешивать библиотеки как бы нежелательно, особенно такие, как кутэ...


Название: Re: Вопрос к знатокам Qt и компиляторов
Отправлено: Dendy от Февраль 17, 2009, 09:12
Даже больше - не нежелательно, а невозможно, так как отдельные куски кода будут импортировать классы с одними и теми же именами. Сам не пробовал, но можно попытаться собрать Qt4, завёрнутым в отдельный namespace. И конечно же создавать в библиотеке экземпляр QApplication (если ещё не был создан) и периодически вызывать у него QApplication::processEvents().

А вообще здравый смысл подсказывает писать библиотеки для Qt3-программ на Qt3, а для Qt4 - на Qt4. Как ни печально.

Ещё можно попробовать вынести Qt4-библиотеку в отдельный процесс, если это не противоречит дизайну основной программы.


Название: Re: Вопрос к знатокам Qt и компиляторов
Отправлено: shadone от Февраль 17, 2009, 11:30
именно - для одновременной работы Qt 3 и 4 нужно собрать последнюю с указанием namespace.

кстати создание QApplication в плагине это не нонсенс а вполне используемая техника при написании плагинов на Qt4к приложению которое не использует Qt.
Есть конечно нюансы - например QApplication должен создаваться в главное (gui) потоке (по другому может работать но этот usecase не поддерживается).


Название: Re: Вопрос к знатокам Qt и компиляторов
Отправлено: ритт от Февраль 17, 2009, 12:02
кстати создание QApplication в плагине это не нонсенс а вполне используемая техника при написании плагинов на Qt4к приложению которое не использует Qt.
нехилый такой плагинчик получится :)
а есть конкретные примеры такого использования?


Название: Re: Вопрос к знатокам Qt и компиляторов
Отправлено: nik135 от Февраль 17, 2009, 12:48
о, кто-то заинтересовался, уже неплохо! создавать либы для 3-ки на 3-ке это конечно хороший совет, но только я до этого мог и сам догадаться(такой вариант не подходит) по поводу qapplication в библиотеке-это для того, чтобы отображался библиотечный виджет и работал событийный механизм. а по поводу неймспейсов- все разнесено и не конфликтует, по крайней мере мне так кажется. а как проверить?


Название: Re: Вопрос к знатокам Qt и компиляторов
Отправлено: shadone от Февраль 17, 2009, 12:50
нехилый такой плагинчик получится :)
а есть конкретные примеры такого использования?
вроде для продуктов Adobe есть плагины на Qt4, подробнее не скажу.


Название: Re: Вопрос к знатокам Qt и компиляторов
Отправлено: BRE от Февраль 17, 2009, 13:21
Плагины они разные бывают.
Вот например, если из библиотеки использующей Qt4 экспортировать следующую функция:
Код
C++ (Qt)
int pluginFunc()
{
   QApplication app(...);
   MyDialog dlg;
   return dlg.exec()
}
 
и использовать ее в приложении использующем Qt3, то проблем особых не будет.
А вот если попробовать сделать что-то подобное:
Код
C++ (Qt)
QTreeView *pluginFinc()
{
   return new QTreeView;
}
 
и попытаться этот виджет встроить в приложение на Qt3, то тут возникает масса вопросов с циклом обработки событий Qt4 (где его запускать? в отдельной ните, не уверен что получиться), его отрисовкой и т.д.
Теперь, помещаем этот TreeView (Qt4) на виджет (Qt3), для него tree будет чужеродным объектом, т.к. это не наследник от QWidget (Qt3), layout manager (Qt3) также не сможет его нормально разместить на parent'е.
Мое мнение, слишком много проблем, а результат .... сомнителен.


Название: Re: Вопрос к знатокам Qt и компиляторов
Отправлено: nik135 от Февраль 17, 2009, 13:48
вот примерно первый вариант у меня и не получается заставить работать. в библиотеке - класс и виджет, который взаимодействует с этим классом. никаких возвратов значений и вызовов с параметрами.  только показать форму с виджетами 4-ки.
а второй вариант мне кажется вообще очень сложно заставить работать.


Название: Re: Вопрос к знатокам Qt и компиляторов
Отправлено: pastor от Февраль 17, 2009, 13:54
А как насчет отдельного процесса для Qt4 (как уже предложил Dendy)?


Название: Re: Вопрос к знатокам Qt и компиляторов
Отправлено: BRE от Февраль 17, 2009, 13:57
вот примерно первый вариант у меня и не получается заставить работать. в библиотеке - класс и виджет, который взаимодействует с этим классом. никаких возвратов значений и вызовов с параметрами.  только показать форму с виджетами 4-ки.
Эта тема уже поднималась: http://www.prog.org.ru/topic_7223_0.html

И кстати да, камрады Dendy и pastor не зря задают тебе вопрос про отдельный процесс.
После запуска функции из плагина твоя основная программа полностью "замерзнет" пока не произойдет выход из этой функции. Пользователю это поведение  явно не понравиться.


Название: Re: Вопрос к знатокам Qt и компиляторов
Отправлено: nik135 от Февраль 17, 2009, 14:48
хм. по ссылке пример под винду и билдер, а здесь линукс и кути. немного не то, не находите? кста, под винду к билдеру я свою либу прикрутил. все работает. вариант с отдельным процессом не нравится тем, что пока данные отдавать не надо, а вдруг понадобится? тогда нужно будет придумывать способ обмена данными между процессами.


Название: Re: Вопрос к знатокам Qt и компиляторов
Отправлено: vaprele07 от Февраль 17, 2009, 14:57
QX11EmbedWidget?


Название: Re: Вопрос к знатокам Qt и компиляторов
Отправлено: BRE от Февраль 17, 2009, 15:25
хм. по ссылке пример под винду и билдер, а здесь линукс и кути. немного не то, не находите?
А какая разница?
Там написано как написать функцию для разделяемой библиотеки, которую можно вызывать из любой программы (даже не использующей Qt).


Название: Re: Вопрос к знатокам Qt и компиляторов
Отправлено: pastor от Февраль 17, 2009, 15:30
QX11EmbedWidget?

Кстати да. Можно попробывать


Название: Re: Вопрос к знатокам Qt и компиляторов
Отправлено: nik135 от Февраль 17, 2009, 15:59
to BRE: перечитайте самое первое сообщение. вопрос состоял в возможности сосуществования двух qapplications. а функции для разделяемых библиотек я писать умею.

а что такое x11embedwidget?



Название: Re: Вопрос к знатокам Qt и компиляторов
Отправлено: pastor от Февраль 17, 2009, 16:17
а что такое x11embedwidget?

Qt4:
QX11EmbedWidget (http://doc.trolltech.com/4.4-snapshot/qx11embedwidget.html)

Qt3:
XEmbed (http://www.qtsoftware.com/products/appdev/add-on-products/catalog/3/Widgets/qtxembed/)


Название: Re: Вопрос к знатокам Qt и компиляторов
Отправлено: BRE от Февраль 17, 2009, 16:32
to BRE: перечитайте самое первое сообщение. вопрос состоял в возможности сосуществования двух qapplications. а функции для разделяемых библиотек я писать умею.
Я обязательно перечитаю первое сообщение.
Смотрим.
Приложением Qt3.
Код
C++ (Qt)
int main( int n, char **v )
{
   QApplication app( n, v );    // Это QApplication Qt3
 
   // Загружаем библиотеку, резольвим функцию и т.д.
   ...
   // Вызываем функцию из библиотеки.
   libFunc();
 
   app.exec();
}
 

Библиотека Qt4.
Код
C++ (Qt)
void libFunc()
{
   QApplication app( 0, 0 );    // Это QApplication Qt4
   MyDialog dlg;
   dlg.exec();
}
 
Будет работать, но при этом полностью заморозит приложение Qt3 на время выполнения функции libFunc.
Вывод: С большими ограничениями сосуществование двух QApplication-объектов возможно.


Название: Re: Вопрос к знатокам Qt и компиляторов
Отправлено: Dendy от Февраль 17, 2009, 18:00
Не вижу никаких технических препятствий одновременного существования двух, трёх, хоть десяти экземпляров QApplication, если они импортируются из разных библиотек. Главное здесь соблести своё пространство имён и строить интерфейс на X11-прослойке. Для Qt3 приложения не существует Qt4, а для плагина неизвестно кто хозяин контейнера. Следовательно - в плагине везде использовать:

Код
C++ (Qt)
using MyQt4Plugin;

Это неймспейс, в который будет завёрнута библиотека Qt4, собраная для этого плагина. Возможно даже статически.

Что касается обработки событий - из интерфейса плагина будет торчать каллбек для обработки сообщений. Основная программа дёргает его по таймеру в главном цикле, а реализация каллбека вызывает QApplication::processEvents(). Потоков это не касается - там свои циклы обработки событий. С блокирующими диалогами это конечно интересно, но думаю всё можно обойти. В крайнем случае - не использовать стиль программирования с блокированием главного цикла.


Название: Re: Вопрос к знатокам Qt и компиляторов
Отправлено: BRE от Февраль 17, 2009, 18:40
Тут вопрос больше не в том, как создать несколько разных экземпляров QApplication, а что можно с ним сделать (или а надо ли их вообще создавать). Какой сервис может предоставить библиотека использующая Qt4, программе использующей Qt3?
Конструировать объекты визуальных классов Qt4 - не выйдет (точнее не их получиться использовать).
Остается экспортировать функции, которые будут выполнять определенную работу (+ возможно, использовать widgetы Qt4). Это обсудили раньше.
Обойти замерзание, конечно можно, передавая в функцию например указатель на processEvents и пусть функция сама его дергает, только как то это все извращенно получается.



Название: Re: Вопрос к знатокам Qt и компиляторов
Отправлено: nik135 от Февраль 17, 2009, 22:52
Тут вопрос больше не в том, как создать несколько разных экземпляров QApplication, а что можно с ним сделать (или а надо ли их вообще создавать). Какой сервис может предоставить библиотека использующая Qt4, программе использующей Qt3?

Тут все дело как обычно, в лени  :)
Сейчас используется класс и форма с самодельными виджетами для работы с этим классом. Потребовалось использовать все это хозяйство под qt3. Вот и все. А переписывать все это под qt3 очень неохота.



Название: Re: Вопрос к знатокам Qt и компиляторов
Отправлено: nik135 от Февраль 17, 2009, 22:56

Библиотека Qt4.
Код
C++ (Qt)
void libFunc()
{
   QApplication app( 0, 0 );    // Это QApplication Qt4
   MyDialog dlg;
   dlg.exec();
}
 
Будет работать, но при этом полностью заморозит приложение Qt3 на время выполнения функции libFunc.
Вывод: С большими ограничениями сосуществование двух QApplication-объектов возможно.

По-моему если указывать в качестве параметров нули- ругается, что не может открыть display. В никсах в качестве параметра передается номер дисплея. ИМХО так, по памяти. Завтра обязательно все проверю. Спасибо всем, если завтра не срастется, буду вас опять мучать  :)


Название: Re: Вопрос к знатокам Qt и компиляторов
Отправлено: Tonal от Февраль 18, 2009, 09:40
Есть следующая проблема: нужно использовать виджет от qt4 в qt3. Обе библиотеки существуют на машине параллельно и используют каждая свои glibc, g++ и т.д.
Для решения задачи создаю библиотеку  средствами qt4 и в ней же создаю объект QApplication. Потом к этой библиотеке линкуюсь из qt3. Все компилируется, но не пашет :-( Валится в сегфолт  >:(
Я не спец в linux-е, но не кажется ли уважаемому сообществу, что использование разных версий glibc, g++ и т.д в одном приложении как раз и может приводить к сегфолту?

По крайней мере под виндой попытка работать из проги с dll-кой, если они собраны разными версиями дельфей в динамике приводит к самым неожиданным падениям...
С MSVC я не настолько плотно работал, но подозреваю что и там не всё шоколадно. :)


Название: Re: Вопрос к знатокам Qt и компиляторов
Отправлено: nik135 от Февраль 18, 2009, 10:20
Сегодня попробовал и вот че получил:

Если создается QApplication из qt4 до создания QApplication из qt3
Код:
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 16384 (LWP 3117)]
0x40816502 in QMutexPool::get () from .../libqt-mt.so.3     

Если создается QApplication из qt3 до создания QApplication из qt4
Код:
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 16384 (LWP 3238)]
0x412a0ee0 in QApplication::desktop () from .../libQtGui.so.4

похоже, не могут поделить экран или что-то в этом духе ???

есть идеи?


Название: Re: Вопрос к знатокам Qt и компиляторов
Отправлено: nik135 от Февраль 18, 2009, 10:25
По крайней мере под виндой попытка работать из проги с dll-кой, если они собраны разными версиями дельфей в динамике  приводит к самым неожиданным падениям.. .
С MSVC я не настолько плотно работал, но подозреваю что и там не всё шоколадно. :)

Странно, если следовать твое логике, то версий dll должно быть много - для работы с приложениями на delphi, builder + еще для каждой версии компилятора свои dll и т.д.

ИМХО это не так. dll это машинный код и без разницы, с каким компилятором его использовать, от дельфей или от билдера, или от MSVC.


Название: Re: Вопрос к знатокам Qt и компиляторов
Отправлено: Tonal от Февраль 18, 2009, 11:15
Представим, что у нас есть dll с pure C интерфейсом и мы статически слинковали с ней приложение.
Пусть теперь у нас появилась другая версия этой же dll с тем же именем, но другой сигнатурой некоторых функций.
Что произойдёт, если ты запустишь своё приложение?

И это только самое простое и видимое. можно не изменять сигнатуру, а например где-то заложится на последовательность вызовов и его поменять.
А если речь идёт не о pure C а о более других языках, и экспортируются не просто функции то всё становится ещё хуже. :(


Название: Re: Вопрос к знатокам Qt и компиляторов
Отправлено: nik135 от Февраль 18, 2009, 11:43
Представим, что у нас есть dll с pure C интерфейсом и мы статически слинковали с ней приложение.
Пусть теперь у нас появилась другая версия этой же dll с тем же именем, но другой сигнатурой некоторых функций.
Что произойдёт, если ты запустишь своё приложение?

А никакой смены-то и не происходит. Есть либа, компиленная одним компилером и есть приложение скомпилированное другим, более поздним. Тогда что плохо?


Название: Re: Вопрос к знатокам Qt и компиляторов
Отправлено: BRE от Февраль 18, 2009, 12:44
Сделал тестовый пример, действительно падает.
Причем падает на этапе подключения библиотеки использующей Qt4 (инициализация статических объектов).

Стек после падения (gdb):
Цитировать
#0  0x0297a61c in QMutex::lock () from /usr/lib/qt-3.3/lib/libqt-mt.so.3
#1  0x008d3f3b in QAbstractFileEngineHandler::QAbstractFileEngineHandler$base ()
   from /usr/lib/libQtCore.so.4
#2  0x008f9bf0 in QTemporaryFile::QTemporaryFile$base () from /usr/lib/libQtCore.so.4
#3  0x008f9c8b in qInitResourceIO () from /usr/lib/libQtCore.so.4
#4  0x008f9ccd in qInitResourceIO () from /usr/lib/libQtCore.so.4
#5  0x00966566 in QTextCodecPlugin::qt_metacast () from /usr/lib/libQtCore.so.4
#6  0x008883e1 in _init () from /usr/lib/libQtCore.so.4
#7  0x49187ff3 in call_init () from /lib/ld-linux.so.2
#8  0x49188103 in _dl_init_internal () from /lib/ld-linux.so.2
#9  0x4917a84f in _dl_start_user () from /lib/ld-linux.so.2

valgrind:
Цитировать
==15965== Process terminating with default action of signal 11 (SIGSEGV)
==15965==  Access not within mapped region at address 0x0
==15965==    at 0x297A61C: QMutex::lock() (in /usr/lib/qt-3.3/lib/libqt-mt.so.3.3.8)
==15965==    by 0x23AF3A: QAbstractFileEngineHandler::QAbstractFileEngineHandler() (in /usr/lib/libQtCore.so.4.3.2)
==15965==    by 0x260BEF: (within /usr/lib/libQtCore.so.4.3.2)
==15965==    by 0x260C8A: (within /usr/lib/libQtCore.so.4.3.2)
==15965==    by 0x260CCC: (within /usr/lib/libQtCore.so.4.3.2)
==15965==    by 0x2CD565: (within /usr/lib/libQtCore.so.4.3.2)
==15965==    by 0x1EF3E0: (within /usr/lib/libQtCore.so.4.3.2)
==15965==    by 0x49187FF2: call_init (in /lib/ld-2.5.so)
==15965==    by 0x49188102: _dl_init (in /lib/ld-2.5.so)
==15965==    by 0x4917A84E: (within /lib/ld-2.5.so)

Конструирует объект QAbstractFileEngineHandler (Qt4), а лочить пытается мутекс из Qt3.
Я библиотеки конечно не пересобирал с разными пространствами имен, вот думаю это проблемы резольвинга символов.

2 nik135: А покажи свой стек возвратов?


Название: Re: Вопрос к знатокам Qt и компиляторов
Отправлено: shadone от Февраль 18, 2009, 12:53
Сделал тестовый пример, действительно падает.
Причем падает на этапе подключения библиотеки использующей Qt4 (инициализация статических объектов).
вам надо собрать qt4 в отдельном namespace.

Странно, если следовать твое логике, то версий dll должно быть много - для работы с приложениями на delphi, builder + еще для каждой версии компилятора свои dll и т.д.
именно так. в случае C++ библиотеки будут разные calling convention (даже в рамках разных версий одного компилятора), плюс если библиотека использует runtime library то еще будут проблемы из-за смешения разных рантаймов.


Название: Re: Вопрос к знатокам Qt и компиляторов
Отправлено: BRE от Февраль 18, 2009, 12:59
вам надо собрать qt4 в отдельном namespace.
Ну не хватало мне еще.
Я выше все расписал, что не пересобирал в отдельном пространстве имен, и думаю не буду.  ;)


Название: Re: Вопрос к знатокам Qt и компиляторов
Отправлено: Tonal от Февраль 18, 2009, 13:03
А никакой смены-то и не происходит. Есть либа, компиленная одним компилером и есть приложение скомпилированное другим, более поздним. Тогда что плохо?
То же самое. В приложение грузится несколько версий одной библиотеки. Из с какой именно свяжется тот или иной символ не однозначно. Что и видно на стеках от BRE

Пересборка с другим пространством имён решит проблему для связывания С++ но не pure C. Кроме того, возможны просто имена каких-то внешних объектов, которые будут конфликтовать...

Мне кажется, в данном случае решение внешним процессом проще и надёжнее.

2 ddenis Соглашения о вызовах (calling convention) ещё можно указать при описаниях, а вот искажения имён уже не укажешь. :)
Кроме того, даже в разных версиях одного компилятора может многое поменяться: в gcc, например не очень давно сменилась предпочтительная модель обработки исключений - с sjlj на dw2. Так что если у тебя динамическая библиотека собранная с одной моделью выкинет исключение, то приложение собранное с другой моделью его не поймает.


Название: Re: Вопрос к знатокам Qt и компиляторов
Отправлено: shadone от Февраль 18, 2009, 13:16
вам надо собрать qt4 в отдельном namespace.
Ну не хватало мне еще.
Я выше все расписал, что не пересобирал в отдельном пространстве имен, и думаю не буду.  ;)
вероятно я неправильно прочитал исходное сообщение. Просто проблема возникнет даже раньше qapplication - в глобальных объектах (global static) которые пересекаются по именам. Поэтому мы не поддерживает загрузку одновременно нескольких версий Qt без namespace. (блин когда уже namespace введем по-умолчанию! :( все не можем из-за проблемы обратной совместимости.

2 ddenis Соглашения о вызовах (calling convention) ещё можно указать при описаниях, а вот искажения имён уже не укажешь. :)
оопс, конечно же я имел ввиду name mangling.
/me похоже еще не проснулся.


Название: Re: Вопрос к знатокам Qt и компиляторов
Отправлено: BRE от Февраль 18, 2009, 13:23
вероятно я неправильно прочитал исходное сообщение. Просто проблема возникнет даже раньше qapplication - в глобальных объектах (global static) которые пересекаются по именам.
Все точно, по стеку возвратов видно, что начинается все еще в dl.


Название: Re: Вопрос к знатокам Qt и компиляторов
Отправлено: nik135 от Февраль 18, 2009, 14:01
2 nik135: А покажи свой стек возвратов?

Код:
#0  0x412a0ee0 in QApplication::desktop () from /usr/local/nik135/lib/libQtGui.so.4
#1  0x412f147a in QWidgetPrivate::adjustedSize () from /usr/local/nik135/lib/libQtGui.so.4
#2  0x412f69ca in QWidget::adjustSize () from /usr/local/nik135/lib/libQtGui.so.4
#3  0x40027bdd in TAlga_gui::init_form () from /usr/local/nik135/lib/libalga.so.1
#4  0x40027c80 in TAlga_gui::TAlga_gui () from /usr/local/nik135/lib/libalga.so.1
#5  0x40029b6a in initAlga () from /usr/local/nik135/lib/libalga.so.1
#6  0x0804a116 in main (argc=1, argv=0xbffff024) at src/main_alga_dll_app.cpp:11

и

Код:
#0  0x40816502 in QMutexPool::get () from /usr/local/nik135/lib/libqt-mt.so.3
#1  0x408610c9 in setup () from /usr/local/nik135/lib/libqt-mt.so.3
#2  0x4085bd97 in QTextCodec::QTextCodec () from /usr/local/nik135/lib/libqt-mt.so.3
#3  0x40868f50 in QFontJis0201Codec::QFontJis0201Codec () from /usr/local/nik135/lib/libqt-mt.so.3
#4  0x4037841e in QFont::initialize () from /usr/local/nik135/lib/libqt-mt.so.3
#5  0x40351c08 in qt_init_internal () from /usr/local/nik135/lib/libqt-mt.so.3
#6  0x40352a99 in qt_init () from /usr/local/nik135/lib/libqt-mt.so.3
#7  0x403dcc19 in QApplication::construct () from /usr/local/nik135/lib/libqt-mt.so.3
#8  0x403dc861 in QApplication::QApplication () from /usr/local/nik135/lib/libqt-mt.so.3
#9  0x0804a10e in main (argc=1, argv=0xbfffeea4) at src/main_alga_dll_app.cpp:9                   


Название: Re: Вопрос к знатокам Qt и компиляторов
Отправлено: nik135 от Февраль 18, 2009, 14:08
Мне кажется, в данном случае решение внешним процессом проще и надёжнее.

Видимо, так и придется делать  :(

Но окончательно разобраться почему неудачен данный подход, все же хочется.
Хотя я чувствовал подвох в пространствах имен.
А как собрать четверку с указанием namespace?


Название: Re: Вопрос к знатокам Qt и компиляторов
Отправлено: BRE от Февраль 18, 2009, 14:16
2 nik135: Собери пожалуйста этот тестик и от него стек возвратов сбрось.

app - Qt3
lib - Qt4


Название: Re: Вопрос к знатокам Qt и компиляторов
Отправлено: ритт от Февраль 18, 2009, 14:36
А как собрать четверку с указанием namespace?
./configure -qtnamespace <namespace> ...


Название: Re: Вопрос к знатокам Qt и компиляторов
Отправлено: pastor от Февраль 18, 2009, 15:27
Видимо, так и придется делать  :(

А вариант с XEmbed рассматривал?


Название: Re: Вопрос к знатокам Qt и компиляторов
Отправлено: nik135 от Февраль 18, 2009, 16:45
2 nik135: Собери пожалуйста этот тестик и от него стек возвратов сбрось.
app - Qt3
lib - Qt4

немного поправленый тобой пример у меня наполовину заработал, т.е. если вызов shareFunc() поместить ДО qt3 QApplication то показывается aboutQt от четверки и приложение валится. Если же shareFunc() поместить ПОСЛЕ qt3 QApplication то не показывается ничего.

Код:
#0  0x4080c502 in QMutexPool::get () from /usr/local/nik135/lib/libqt-mt.so.3
#1  0x408570c9 in setup () from /usr/local/nik135/lib/libqt-mt.so.3
#2  0x40851d97 in QTextCodec::QTextCodec () from /usr/local/nik135/lib/libqt-mt.so.3
#3  0x4085ef50 in QFontJis0201Codec::QFontJis0201Codec () from /usr/local/nik135/lib/libqt-mt.so.3
#4  0x4036e41e in QFont::initialize () from /usr/local/nik135/lib/libqt-mt.so.3
#5  0x40347c08 in qt_init_internal () from /usr/local/nik135/lib/libqt-mt.so.3
#6  0x40348a99 in qt_init () from /usr/local/nik135/lib/libqt-mt.so.3
#7  0x403d2c19 in QApplication::construct () from /usr/local/nik135/lib/libqt-mt.so.3
#8  0x403d2861 in QApplication::QApplication () from /usr/local/nik135/lib/libqt-mt.so.3
#9  0x0804a0be in main (argn=1, argv=0xbfffda14) at main.cpp:8   

Код:
#0  0x41272ee0 in QApplication::desktop () from /usr/local/nik135/lib/libQtGui.so.4
#1  0x4174afac in QDialog::adjustPosition () from /usr/local/nik135/lib/libQtGui.so.4
#2  0x4174b394 in QDialog::setVisible () from /usr/local/nik135/lib/libQtGui.so.4
#3  0x41749b00 in QDialog::exec () from /usr/local/nik135/lib/libQtGui.so.4
#4  0x4176d70b in QMessageBox::aboutQt () from /usr/local/nik135/lib/libQtGui.so.4
#5  0x40021f3d in shareFunc (argn=1, argc=0xbfffe814) at lib.cpp:10
#6  0x0804a0ce in main (argn=1, argv=0xbfffe814) at main.cpp:9     


Название: Re: Вопрос к знатокам Qt и компиляторов
Отправлено: nik135 от Февраль 18, 2009, 16:49
А вариант с XEmbed рассматривал?

Нет еще, но он мне не очень нравится, т.к. пропадет кроссплатформенность. Но все равно спасибо за ссылки, это лучше чем ничего  :D


Название: Re: Вопрос к знатокам Qt и компиляторов
Отправлено: pastor от Февраль 18, 2009, 17:01
Нет еще, но он мне не очень нравится, т.к. пропадет кроссплатформенность. Но все равно спасибо за ссылки, это лучше чем ничего  :D

Да, кроссовости не будет. Я думал только под Х11 нужно.

Догда отстается:
1) использовать процессы, обмен данными можно вести, например, через сокеты
2) переписать Qt4 приложения на Qt3 (плохое решение, я бы нестал так делать)
2) переписать Qt3 приложения на Qt4 (об этом стоит задуматься, хотябы портануть на Qt3Support)