Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: silart от Ноябрь 15, 2010, 19:19



Название: Переменные среды и MSVS
Отправлено: silart от Ноябрь 15, 2010, 19:19
Добрый день!

Qt собираю MSVS 2008 в виде двух версий: static и shared. В итоге у меня получается 2 папки (два значения QTDIR): в одной лежит static версия qt, в другой - shared. Со студией я использую Visual Studio Add-in, который позволяет выбрать нужную версию Qt из нескольких имеющихся. Как работает этот addin? Очевидно, он задает в проекте значение переменной QTDIR.
Внимание, вопрос!  :)
Каким образом можно вручную задать QTDIR для конкретного проекта?
Для чего все это нужно. Дело в том, что я решил сделать библиотеку, которая будет содержать часто употребимые функции, классы, виджеты. Библиотека эта - static library. И все бы хорошо, но когда у тебя один проект собирается с библиотеками qt версии static, а другой - с библиотеками shared, возникает куча warning'ов вида:
Код:
1>QMiniLibsd.lib(axdoc.obj) : warning LNK4217: локально определенный символ ??6QTextStream@@QAEAAV0@ABVQString@@@Z (public: class QTextStream & __thiscall QTextStream::operator<<(class QString const &)) импортирован в функцию "void __cdecl ml::qt::CreateDocumentation(class QString const &,class QString const &)" (?CreateDocumentation@qt@ml@@YAXABVQString@@0@Z)
1>QMiniLibsd.lib(axdoc.obj) : warning LNK4217: локально определенный символ ??0QTextStream@@QAE@PAVQIODevice@@@Z (public: __thiscall QTextStream::QTextStream(class QIODevice *)) импортирован в функцию "void __cdecl ml::qt::CreateDocumentation(class QString const &,class QString const &)" (?CreateDocumentation@qt@ml@@YAXABVQString@@0@Z)
1>QMiniLibsd.lib(axdoc.obj) : warning LNK4217: локально определенный символ ?open@QFile@@UAE_NV?$QFlags@W4OpenModeFlag@QIODevice@@@@@Z (public: virtual bool __thiscall QFile::open(class QFlags<enum QIODevice::OpenModeFlag>)) импортирован в функцию "void __cdecl ml::qt::CreateDocumentation(class QString const &,class QString const &)" (?CreateDocumentation@qt@ml@@YAXABVQString@@0@Z)
Эти предупреждения вылазят, если QTDIR моей библиотеки и проекта различаются. И получается, что для каждого проекта, использующего мою библиотеку, нужно задавать нужный QTDIR и пересобирать всю библиотеку. Это очень неудобно.
Моя библиотека не использует lib-файлы Qt, эти файлы задает проект. Я хочу задать QTDIR для каждой конфигурации проекта: (debug, release, static_debug, static_release), но это не получается сделать, addin задает его на весь проект.

Может быть эту проблему можно решить и по-другому?


Название: Re: Переменные среды и MSVS
Отправлено: Aleksei от Ноябрь 16, 2010, 09:55
Предлагаю такое решение. Запускаешь Command Prompt. В моем случае, например, это Windows SDK 7.1 Command Prompt

>set PATH="path/to/qt/static/bin;%PATH%"
>set QTDIR=path/to/qt/static
>qmake project_static.pro  (для создания vcproj: qmake -tp vc project_static.pro)
>nmake (если нужно собрать проект сразу же)

Закрываешь Command Prompt и опять открываешь:
>set PATH="path/to/qt/shared/bin;%PATH%"
>set QTDIR=path/to/qt/shared
>qmake -tp vc project_shared.pro (для создания vcproj: qmake -tp vc project_shared.pro)
>nmake (если нужно собрать проект сразу же)

В студии работаешь только с каким-нибудь одним проектом.
Либо, во всех местах vcproj-файлах вручную заменяешь $(QTDIR) на соответствующие пути.


Название: Re: Переменные среды и MSVS
Отправлено: silart от Ноябрь 17, 2010, 12:23
Вышел из положения следующим образом: создал в одном солюшене два проекта (static и shared). Причем файлы у обоих проектов одни и те же. Теперь для каждого проекта задаю свою версию Qt, и все собирается!  :)

Aleksei, конечно можно все собирать из коммандной строки, но только не на данном этапе. В библиотеку постоянно добавляются новые классы, и собирать ее из IDE удобнее, чем из командной строки.