• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Ошибка При Построении Release В Vc 2010 Express.

  • Автор темы alsav22
  • Дата начала
A

alsav22

Использую qt-win-opensource-4.8.1-vs2010 с VC 2010 Express. Проект разделён на три файла:
mainwindow.h
C++:
#include <QtGui>
#include <QtCore>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
};
mainwindow.cpp
C++:
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
{
QLabel* label=new QLabel(this);

label->setText("Здравствуй, Мир!");
label->setAlignment(Qt::AlignCenter);
setCentralWidget(label);
}
C++:
main.cpp 
#include "mainwindow.h"
int main(int argc, char **argv)
{
QApplication app(argc, argv);
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("CP1251"));
MainWindow w;
w.resize(600,350);

QPushButton cmd("ADD");
cmd.show();
w.show();

QObject::connect(&cmd, SIGNAL(clicked()), &app, SLOT(quit()));

return app.exec();
}
После первого построения (с ошибками), в файлы исходного кода добавляется: moc_mainwindow.h.cpp, который создаётся moc , для чего в Свойста проекта, Все конфигурации, События постороения, Событие перед постороением, Командная строка, добавленно:
C++:
moc -o moc_mainwindow.h.cpp mainwindow.h

Построение Debug нормально проходит. Если Release, то:
C++:
1>------ Построение начато: проект: Qt5, Конфигурация: Release Win32 ------
1> mainwindow.cpp
1> moc_mainwindow.h.cpp
1>qtmaind.lib(qtmain_win.obj) : error LNK2038: обнаружено несоответствие для "_ITERATOR_DEBUG_LEVEL": значение "2" не соответствует значению "0" в main.obj
1>MSVCRT.lib(cinitexe.obj) : warning LNK4098: библиотека по умолчанию "msvcrtd.lib" противоречит использованию других библиотек; используйте параметр /NODEFAULTLIB:library
1>D:\MY C++Projects\Qt5\Release\Qt5.exe : fatal error LNK1319: обнаружено несоответствий: 1
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
Если для Release в Свойствах проекта, Компоновка, Ввод, Игнорировать все стандартные библиотеки - прописать: msvcrtd.lib, то:
C++:
1>------ Построение начато: проект: Qt5, Конфигурация: Release Win32 ------
1> moc_mainwindow.h.cpp
1>qtmaind.lib(qtmain_win.obj) : error LNK2038: обнаружено несоответствие для "_ITERATOR_DEBUG_LEVEL": значение "2" не соответствует значению "0" в main.obj
1>D:\MY C++Projects\Qt5\Release\Qt5.exe : fatal error LNK1319: обнаружено несоответствий: 1
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
Ошибка появляется, если в Свойстах проекта, Все конфигурации, Компоновщик, Система, Подсистема прописана Windows. На Debug это никак не отражается, а при Release появляются описанные выше ошибки. Если для Release выставить Консоль или Не задано, тогда ошибок нет, но при запуске приложения открывается окно консоли, которое мне совершенно не нужно.
Как можно сделать, чтобы и ошибок не было и консоль не открывалась?
 
A

alsav22

Использую qt-win-opensource-4.8.1-vs2010 с VC 2010 Express. Проект разделён на три файла:
mainwindow.h
C++:
#include <QtGui>
#include <QtCore>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
};
mainwindow.cpp
C++:
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
{
QLabel* label=new QLabel(this);

label->setText("Здравствуй, Мир!");
label->setAlignment(Qt::AlignCenter);
setCentralWidget(label);
}
C++:
main.cpp 
#include "mainwindow.h"
int main(int argc, char **argv)
{
QApplication app(argc, argv);
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("CP1251"));
MainWindow w;
w.resize(600,350);

QPushButton cmd("ADD");
cmd.show();
w.show();

QObject::connect(&cmd, SIGNAL(clicked()), &app, SLOT(quit()));

return app.exec();
}
После первого построения (с ошибками), в файлы исходного кода добавляется: moc_mainwindow.h.cpp, который создаётся moc , для чего в Свойста проекта, Все конфигурации, События постороения, Событие перед постороением, Командная строка, добавленно:
C++:
moc -o moc_mainwindow.h.cpp mainwindow.h

Построение Debug нормально проходит. Если Release, то:
C++:
1>------ Построение начато: проект: Qt5, Конфигурация: Release Win32 ------
1> mainwindow.cpp
1> moc_mainwindow.h.cpp
1>qtmaind.lib(qtmain_win.obj) : error LNK2038: обнаружено несоответствие для "_ITERATOR_DEBUG_LEVEL": значение "2" не соответствует значению "0" в main.obj
1>MSVCRT.lib(cinitexe.obj) : warning LNK4098: библиотека по умолчанию "msvcrtd.lib" противоречит использованию других библиотек; используйте параметр /NODEFAULTLIB:library
1>D:\MY C++Projects\Qt5\Release\Qt5.exe : fatal error LNK1319: обнаружено несоответствий: 1
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
Если для Release в Свойствах проекта, Компоновка, Ввод, Игнорировать все стандартные библиотеки - прописать: msvcrtd.lib, то:
C++:
1>------ Построение начато: проект: Qt5, Конфигурация: Release Win32 ------
1> moc_mainwindow.h.cpp
1>qtmaind.lib(qtmain_win.obj) : error LNK2038: обнаружено несоответствие для "_ITERATOR_DEBUG_LEVEL": значение "2" не соответствует значению "0" в main.obj
1>D:\MY C++Projects\Qt5\Release\Qt5.exe : fatal error LNK1319: обнаружено несоответствий: 1
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
Ошибка появляется, если в Свойстах проекта, Все конфигурации, Компоновщик, Система, Подсистема прописана Windows. На Debug это никак не отражается, а при Release появляются описанные выше ошибки. Если для Release выставить Консоль или Не задано, тогда ошибок нет, но при запуске приложения открывается окно консоли, которое мне совершенно не нужно.
Как можно сделать, чтобы и ошибок не было и консоль не открывалась?

Решение такое. Подключить заголовочный файл
C++:
#include <Windows.h>
.
Вместо
C++:
int main(int argc, char **argv)
написать:
C++:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpcmdline, int ncmdshow)
. Вместо
C++:
QApplication app(argc, argv);
написать:
C++:
QApplication app(ncmdshow, (char **)lpcmdline);
.
 
R

rrrFer

Странное решение, вы теряете переносимость кода.
Однако, я под студией QT проекты не собирал, поэтому ничего не смог посоветовать )

Не скажете зачем вы студию используете? Есть ведь QTCreator...
 
A

alsav22

Я только учусь. К VS привык, вот и решил совместить. А в QTCreator у меня всякие мелкие проблемы. Например, почему-то не создаётся релиз, хотя при создании проекта заказывется.
Есть ещё вариант совместить VS и Qt. На VS Ultimate поставить аддон qt-vs-addin. Тогда в VS можно будет создавать проекты Qt.
Насчёт переносимости(хотя, мне рано ещё об этом). Наверное, для этого конктетного случая, можно точку входа при переносе вручную переписывать, или как-то организовать перезапись через #define ?

Сейчас через #define попробовал. Получается. Если нужно увидеть отладочную информацию, то можно как консольное запустить. Если не нужно - то, как оконное.
 
R

rrrFer

Программы на QT обычно без проблем работают как минимум под win и Lin.
Путь к проекту к Creator должен содержать только английские символы(ну и пробелы я бы убрал на всякий пожарный).
сли нужно увидеть отладочную информацию, то можно как консольное запустить. Если не нужно - то, как оконное.
не понял. Что имеется ввиду под отладочной информацией?
то что выводится в qDebug() в креаторе можно увидеть всегда, там для этого специальная вкладка есть.
 
A

alsav22

не понял. Что имеется ввиду под отладочной информацией?
то что выводится в qDebug() в креаторе можно увидеть всегда, там для этого специальная вкладка есть.
Я же не в Creator делаю, а в VS.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!