Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: fulkabaster от Декабрь 22, 2009, 12:06



Название: QListWidget выдает ошибку линкера в WinXP
Отправлено: fulkabaster от Декабрь 22, 2009, 12:06
Делаю проект, в нем задействовано несколько диалоговых окон. Пишу код под линуксом, там все отлично работает. В виндовсе же nmake выдает следующую ошибку

Цитировать
..\QT\4.4.3\include\QtCore/../../src/corelib/tools/qset.h(296) : error C2955: 'list' : use of class template requires template argument list
        C:\Program Files\Microsoft Visual Studio\VC98\include\list(415) : see declaration of 'list'
myform.cpp
Generating Code...
NMAKE : fatal error U1077: 'cl' : return code '0x2'
Stop.
NMAKE : fatal error U1077: '"C:\Program Files\Microsoft Visual Studio\VC98\bin\NMAKE.EXE"' : return code '0x2'
Stop.

При чем здесь qset.h - непонятно, я оттуда ничего не юзаю.
Но методом исключения обнаружил, что виновником является один QListWidget, используемый в одном из диалоговых окон. Если его удалить и закомментировать все ссылки на него - ошибки нет. Менял его имя - не помогло.

Что не нравится виндовсу?


Название: Re: QListWidget выдает ошибку линкера в WinXP
Отправлено: Vass от Декабрь 22, 2009, 12:34
А код показать не хотите, на котором падает?  В частности интересует объявление и инициализация QListWidget


Название: Re: QListWidget выдает ошибку линкера в WinXP
Отправлено: DmP от Декабрь 22, 2009, 12:36
Наверное это (http://doc.trolltech.com/4.6/compiler-notes.html#visual-studio-windows)


Название: Re: QListWidget выдает ошибку линкера в WinXP
Отправлено: DmP от Декабрь 22, 2009, 12:38
Или это (http://doc.trolltech.com/4.6/supported-platforms.html#tier-1-platforms)


Название: Re: QListWidget выдает ошибку линкера в WinXP
Отправлено: fulkabaster от Декабрь 22, 2009, 13:05
А код показать не хотите, на котором падает?  В частности интересует объявление и инициализация QListWidget
Я его вставил в дизайнере, не вручную, как и все остальное. Так что не заботился об инициализации.
Проблему решил (временно) так - пошел в тот файл (QT\4.4.3\src\corelib\tools) и в ту строчку (296), которые выдаются в ошибке, и увидел там это:
Цитировать
template <typename T>
QSet<T> QSet<T>::fromList(const QList<T> &list)
{
    return list.toSet();
}

Просто закомментировал это, и ошибка исчезла. Но че ему здесь не понравилось - так и не понял. Есть догадка, что какой-то конфликт имен между этим QT-шным файлом и майкрософтовским файлом от Visual Studio.


Название: Re: QListWidget выдает ошибку линкера в WinXP
Отправлено: Dendy от Декабрь 23, 2009, 05:49
Просто закомментировал это, и ошибка исчезла.

Отличное решение проблемы! Ждите в гости segmentation fault. Подозреваю нужно просто исправить: return list.toSet<T>()
А вообще признайтесь, у вас и впрямь Visual Studio 6?


Название: Re: QListWidget выдает ошибку линкера в WinXP
Отправлено: fulkabaster от Декабрь 23, 2009, 15:08
Отличное решение проблемы! Ждите в гости segmentation fault.
Нет, все работает теперь нормально.

Цитировать
Подозреваю нужно просто исправить: return list.toSet<T>()
Неужели разработчики облопошились, и это все еще было незамечено?

Цитировать
А вообще признайтесь, у вас и впрямь Visual Studio 6?
Да.


Название: Re: QListWidget выдает ошибку линкера в WinXP
Отправлено: lit-uriy от Декабрь 23, 2009, 15:30
Цитировать
Менял его имя - не помогло.
Цитировать
Есть догадка, что какой-то конфликт имен между этим QT-шным файлом и майкрософтовским файлом от Visual Studio.
Интересная догадка!
В сообщении об ошибке ни намёка о конфликте имён:
Цитировать
'list' : use of class template requires template argument list


Название: Re: QListWidget выдает ошибку линкера в WinXP
Отправлено: Dendy от Декабрь 23, 2009, 16:16
Нет, все работает теперь нормально.

Поправьте правильно, не ленитесь.

Неужели разработчики облопошились, и это все еще было незамечено?

Visual Studio 6 была выброшена из списка компиляторов, а в Qt 4.7 выбросят и Visual Studio 7 (2003).


Название: Re: QListWidget выдает ошибку линкера в WinXP
Отправлено: fulkabaster от Декабрь 28, 2009, 10:16
Поправьте правильно, не ленитесь.
Исправил, работает, спасибо.

Цитировать
Интересная догадка!
В сообщении об ошибке ни намёка о конфликте имён:
'list' : use of class template requires template argument list
Именно поэтому я и согрешил сначала на конфликт имен - в одном пространстве имен такому классу нужны аргументы, а в другом - нет :) Я когда по номеру ошибки искал инфу в инете, обнаружил, что чаще всего она выдается при конфликтах имен, при запарках с пространством имен.
Но вроде все решилось.


Название: Re: QListWidget выдает ошибку линкера в WinXP
Отправлено: fulkabaster от Февраль 10, 2010, 13:56
Опять похожая проблема, теперь с QVariant.
В конструкторе приложения создается объект QSettings и из системы считываются настройки. В частности, нужно считывать сохраненный цвет в QColor. У объекта QSettings нет метода .toQColor(), но в ассистанте подсказано, как это сделать. Я так и сделал, и в линуксе все пашет:
Код:
  
QSettings *sets = new QSettings(...);
QVariant *variant = new QVariant;
*variant = sets->value("color", Qt::green);
QColor color = variant->value<QColor>();

А компилятор MS Visual C++ заругался:
Цитировать
.\mainwindow.cpp(32) : error C2039: 'value' : is not a member of 'QVariant'
        ..\QT\4.4.3\include\QtCore/../../src/corelib/kernel/qvariant.h(95) : see
 declaration of 'QVariant'
.\mainwindow.cpp(32) : error C2059: syntax error : ')'
NMAKE : fatal error U1077: 'cl' : return code '0x2'
Stop.

Если источником таких проблем является это:
Цитировать
Visual Studio 6 была выброшена из списка компиляторов, а в Qt 4.7 выбросят и Visual Studio 7 (2003).
то какой компилятор посоветуете для WinXP? Можно самый простой, но нормально работающий с QT - я в винде только компилю, разрабатываю в линуксе.


Название: Re: QListWidget выдает ошибку линкера в WinXP
Отправлено: Dendy от Февраль 22, 2010, 19:38
Microsoft Visual C++ 2008 Express Edition или MinGW