Russian Qt Forum
Ноябрь 25, 2024, 21:26 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: Вопрос к знатокам Qt и компиляторов  (Прочитано 21418 раз)
BRE
Гость
« Ответ #30 : Февраль 18, 2009, 12:59 »

вам надо собрать qt4 в отдельном namespace.
Ну не хватало мне еще.
Я выше все расписал, что не пересобирал в отдельном пространстве имен, и думаю не буду.  Подмигивающий
Записан
Tonal
Гость
« Ответ #31 : Февраль 18, 2009, 13:03 »

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

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

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

2 ddenis Соглашения о вызовах (calling convention) ещё можно указать при описаниях, а вот искажения имён уже не укажешь. Улыбающийся
Кроме того, даже в разных версиях одного компилятора может многое поменяться: в gcc, например не очень давно сменилась предпочтительная модель обработки исключений - с sjlj на dw2. Так что если у тебя динамическая библиотека собранная с одной моделью выкинет исключение, то приложение собранное с другой моделью его не поймает.
Записан
shadone
Гость
« Ответ #32 : Февраль 18, 2009, 13:16 »

вам надо собрать qt4 в отдельном namespace.
Ну не хватало мне еще.
Я выше все расписал, что не пересобирал в отдельном пространстве имен, и думаю не буду.  Подмигивающий
вероятно я неправильно прочитал исходное сообщение. Просто проблема возникнет даже раньше qapplication - в глобальных объектах (global static) которые пересекаются по именам. Поэтому мы не поддерживает загрузку одновременно нескольких версий Qt без namespace. (блин когда уже namespace введем по-умолчанию! Грустный все не можем из-за проблемы обратной совместимости.

2 ddenis Соглашения о вызовах (calling convention) ещё можно указать при описаниях, а вот искажения имён уже не укажешь. Улыбающийся
оопс, конечно же я имел ввиду name mangling.
* ddenis похоже еще не проснулся.
Записан
BRE
Гость
« Ответ #33 : Февраль 18, 2009, 13:23 »

вероятно я неправильно прочитал исходное сообщение. Просто проблема возникнет даже раньше qapplication - в глобальных объектах (global static) которые пересекаются по именам.
Все точно, по стеку возвратов видно, что начинается все еще в dl.
« Последнее редактирование: Февраль 18, 2009, 13:45 от BRE » Записан
nik135
Гость
« Ответ #34 : Февраль 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                   
Записан
nik135
Гость
« Ответ #35 : Февраль 18, 2009, 14:08 »

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

Видимо, так и придется делать  Грустный

Но окончательно разобраться почему неудачен данный подход, все же хочется.
Хотя я чувствовал подвох в пространствах имен.
А как собрать четверку с указанием namespace?
Записан
BRE
Гость
« Ответ #36 : Февраль 18, 2009, 14:16 »

2 nik135: Собери пожалуйста этот тестик и от него стек возвратов сбрось.

app - Qt3
lib - Qt4
Записан
ритт
Гость
« Ответ #37 : Февраль 18, 2009, 14:36 »

А как собрать четверку с указанием namespace?
./configure -qtnamespace <namespace> ...
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #38 : Февраль 18, 2009, 15:27 »

Видимо, так и придется делать  Грустный

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

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
nik135
Гость
« Ответ #39 : Февраль 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     
Записан
nik135
Гость
« Ответ #40 : Февраль 18, 2009, 16:49 »

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

Нет еще, но он мне не очень нравится, т.к. пропадет кроссплатформенность. Но все равно спасибо за ссылки, это лучше чем ничего  Веселый
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #41 : Февраль 18, 2009, 17:01 »

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

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

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

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.129 секунд. Запросов: 22.