Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Общие вопросы _ Переносимость файлов проекта qmake между ОС

Автор: Алексей1153 5.2.2011, 18:27

Уже несколько раз столкнулся с тем, что некоторые настройки проекта работают в винде, но требуют допиливания в линуксе (и наоборот)

Первый вопрос такой: теневая сборка в QtCreator. Под виндой указывается абсолютный путь, а если это не так, то путь отсчитывается от папки установки Qt.

А во как сделать так, чтобы универсально задавалась папка X, которая лежит на 1 шаг выше по дереву каталогов, чем файл *.pro?


Второй вопрос: профиль. Под виндой , к примеру, 4.7.0 (а "Qt в PATH" не определён), под линуксом приходится вручную выбирать "Qt в PATH". Как обобщить ?

Третий вопрос - кодировки. Вот в соседней теме озвучил, повторюсь, как вывернулся

Цитата
1) все файлы проекта - в кодировке UTF-8
2) кодировка среды по умолчанию - UTF-8
3) строки оборачиваю в QString::fromUtf8("русский текст")

- наткнулся на этот вариант, пытаясь сделать универсально для винды и для линукса. Больше вроде не было проблем

Кстати, интересно, правильно ли я сделал, или оно "просто пока работает" ?

Автор: maint 5.2.2011, 18:54

Цитата(Алексей1153 @ 5.2.2011, 23:27) *
Уже несколько раз столкнулся с тем, что некоторые настройки проекта работают в винде, но требуют допиливания в линуксе (и наоборот)

Первый вопрос такой: теневая сборка в QtCreator. Под виндой указывается абсолютный путь, а если это не так, то путь отсчитывается от папки установки Qt.

А во как сделать так, чтобы универсально задавалась папка X, которая лежит на 1 шаг выше по дереву каталогов, чем файл *.pro?


Второй вопрос: профиль. Под виндой , к примеру, 4.7.0 (а "Qt в PATH" не определён), под линуксом приходится вручную выбирать "Qt в PATH". Как обобщить ?

Третий вопрос - кодировки. Вот в соседней теме озвучил, повторюсь, как вывернулся
Цитата
1) все файлы проекта - в кодировке UTF-8
2) кодировка среды по умолчанию - UTF-8
3) строки оборачиваю в QString::fromUtf8("русский текст")

- наткнулся на этот вариант, пытаясь сделать универсально для винды и для линукса. Больше вроде не было проблем

Кстати, интересно, правильно ли я сделал, или оно "просто пока работает" ?


на первый вопрос. В обоих системах можно указать одинаково
../имя_файла.cpp

например у меня
SOURCES = main.cpp \
    ../common/init.cpp \
    logfile.c

вопрос второй. Формализовать не получилось у меня. PATH - это от операционной системы. На новом месте укзывать для сборки обязятельно
вопрс третий. Сделано абсолютно правильно. Только я, еще (непомню откуда взял правило, то ли сам допер, то ли вычитал) укаываю в main.cpp
#ifdef _LINUX
    setlocale(LC_ALL, "ru_RU.UTF-8");
#endif
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF8"));
#ifdef _WIN32
    setlocale(LC_ALL, "Russian");
#endif

в проекте соотвественно
win32 { 
    DEFINES += _WIN32
}
unix {
    DEFINES += _LINUX
}



Автор: Алексей1153 5.2.2011, 18:58

Цитата(maint @ 5.2.2011, 20:54) *
на первый вопрос. В обоих системах можно указать одинаково
../имя_файла.cpp

э... Вообще-то , вопрос не об этом. А о выходных файлах. Если там указать оператор шага наверх, то скомпилится просто напросто не в папке Qt, а на шаг выше (c:/2010.05/ у меня)


Цитата(maint @ 5.2.2011, 20:54) *
указываю в main.cpp


а вот надо ли ? :) Вопрос остался открытым


Цитата(maint @ 5.2.2011, 20:54) *
#ifdef _LINUX
#ifdef _WIN32

во, за дефайны спасибо, что напомнил, я и забыл про них совсем )) Пригодится.

Автор: Litkevich Yuriy 5.2.2011, 18:59

Цитата(Алексей1153 @ 5.2.2011, 20:27) *
Переносимость файлов проекта для QtCreator между ОС
Файлы проектов креатора в принципе не переносимы. Никогда не таскай их. переносимыми являются только файлы qmake (*.pro/*.pri)

Автор: Алексей1153 5.2.2011, 19:01

Цитата(Litkevich Yuriy @ 5.2.2011, 20:59) *
переносимыми являются только файлы qmake (*.pro/*.pri)

так я про них и говорю. Ну и H+CPP+ресурсы. А какие ещё файлы проекта есть ?

Автор: maint 5.2.2011, 19:19

Цитата(Алексей1153 @ 5.2.2011, 23:58) *
Цитата(maint @ 5.2.2011, 20:54) *
на первый вопрос. В обоих системах можно указать одинаково
../имя_файла.cpp

э... Вообще-то , вопрос не об этом. А о выходных файлах. Если там указать оператор шага наверх, то скомпилится просто напросто не в папке Qt, а на шаг выше (c:/2010.05/ у меня)


Цитата(maint @ 5.2.2011, 20:54) *
указываю в main.cpp


а вот надо ли ? :) Вопрос остался открытым


Цитата(maint @ 5.2.2011, 20:54) *
#ifdef _LINUX
#ifdef _WIN32

во, за дефайны спасибо, что напомнил, я и забыл про них совсем )) Пригодится.

вообще файлики имя.pro.user тащить с собой не только между разными идеологически системами, но в просто на другую машину вредно для здоровья.В main.cрp указывать надо. Локаль определять может и не стоит (если не с базами работа). Но для вывода текста
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF8"));
я бы все же рекомендовал. Не пожалеешь при перетаскивании проекта. Была у меня плюха с этим. Вдруг при переносе из линуха в винду, кажется или наоборот, вдруг дурь началась в моей диагностике. Я убил 2 дня, пока дошло. И просрочил срок сдачи :)

Автор: Алексей1153 5.2.2011, 19:27

Цитата(maint @ 5.2.2011, 21:19) *
вообще файлики имя.pro.user тащить с собой не только между разными идеологически системами, но в просто на другую машину вредно для здоровья

там вроде ничего опасного не хранится. Специально заглянул сейчас

а XML - он как бы и в Африке не doc ))

Автор: maint 5.2.2011, 19:32

Цитата(Алексей1153 @ 6.2.2011, 0:27) *
Цитата(maint @ 5.2.2011, 21:19) *
вообще файлики имя.pro.user тащить с собой не только между разными идеологически системами, но в просто на другую машину вредно для здоровья

там вроде ничего опасного не хранится. Специально заглянул сейчас

а XML - он как бы и в Африке не doc ))

например недавно здесь пробегала тема, почему дебагер не заводится.

Автор: igor_bogomolov 5.2.2011, 20:49

maint, Не надо цитировать целыми сообщениями, получается очень громоздко и тяжело читать.

В первый вопроса так и не въехал. Напиши проще что делаешь, что в результате получаешь и что хотелось бы получить.
Я теневую сборку в своих проектах не использую. Предпочитаю сам указывать куда должны помещаться библиотеки, бинарники, файлы сборки и т.д.

ОС можно определить проще. Смотри определения Q_OS_* (Q_OS_LINUX, Q_OS_UNIX, Q_OS_WIN32, etc).

Автор: Алексей1153 5.2.2011, 20:55

Цитата(igor_bogomolov @ 5.2.2011, 22:49) *
В первый вопроса так и не въехал

да вроде разобрались уже - вручную и придётся указывать :)

Цитата(igor_bogomolov @ 5.2.2011, 22:49) *
ОС можно определить проще. Смотри определения Q_OS_* (Q_OS_LINUX, Q_OS_UNIX, Q_OS_WIN32, etc).

эти определения в pro/pri тоже видны ?

Автор: igor_bogomolov 5.2.2011, 21:04

Цитата(Алексей1153 @ 5.2.2011, 20:55) *
эти определения в pro/pri тоже видны ?
Нет, это в коде. Просто излишне повторять уже имеющиеся определения. Если нужно в про файле определять ОС, делай как написал maint во втором сообщении

Автор: Алексей1153 5.2.2011, 21:08

а, я не сразу увидел - там вроде пространства имён (это я про файл проекта)

win32
{
}

unix
{
}

Автор: maint 5.2.2011, 21:15

Цитата(igor_bogomolov @ 6.2.2011, 2:04) *
Просто излишне повторять уже имеющиеся определения. Если нужно в про файле определять ОС, делай как написал maint во втором сообщении

вот задница в том, что при кроссплатформенном программировании зачастую приходится использовать и соотвествующие библиотеки. Так вот, определения ОС в QT это изобретение именно QT. И хедеры сторонних кросплатформенных библиотек заточены именно на _WIN32 _LINUX. Исторически сложилось. Так что указывая эти имена я просто избегаю нагромождений и путанницы при условной компиляции

Автор: maint 5.2.2011, 21:47

фу, сам запутался, затрепался. В файле проекта указываешь (это по первому вопросу)

    
MOC_DIR = ../moc
OBJECTS_DIR = ../obj

нужные наименования каталогов http://qtdocs.narod.ru/4.1.0/doc/html/qmake-variable-reference.html

Автор: Алексей1153 5.2.2011, 22:03

maint, ок, попробую

Автор: Алексей1153 5.2.2011, 22:55

maint,

сделал так

MOC_DIR    =$$PWD/../temp
OBJECTS_DIR=$$PWD/../temp
DESTDIR    =$$PWD/../temp
RCC_DIR    =$$PWD/../temp

теперь попадает всё в одну папку, расположенную рядом с папкой проекта. Только нет различия для файлов дебага и релиза - это как задать ?

и ещё - можно ли путь $$PWD/../temp один раз задать, а не 4 раза ?

Автор: igor_bogomolov 5.2.2011, 23:30

TMP_DIR = $$PWD/../temp
CONFIG (debug, debug|release) {
    OBJECTS_DIR = $${TMP_DIR}/debug
}else{
    OBJECTS_DIR = $${TMP_DIR}/release
}

UI_DIR  = $${TMP_DIR}/uic
MOC_DIR = $${TMP_DIR}/moc
RCC_DIR = $${TMP_DIR}/rcc

Автор: Алексей1153 5.2.2011, 23:39

CONFIG (debug, debug|release) {

а эта конструкция как работает ? Содержимое в скобках, вернее

Автор: igor_bogomolov 5.2.2011, 23:53

По моему из примера вполне понятно, как она работает.

Автор: Алексей1153 6.2.2011, 0:03

да не совсем. Как выбирается условие ? Выход всегда в релизную папку попадает, неважно , что выбрали - дебаг или релиз

или это я устал уже. Попробую утром разобраться )

Автор: Litkevich Yuriy 6.2.2011, 7:50

Цитата(Алексей1153 @ 5.2.2011, 21:01) *
А какие ещё файлы проекта есть ?
у креатора свой файл проекта (расширение *.pro.user). Так что не путай людей, пиши название темы точно.

Автор: Алексей1153 6.2.2011, 11:41

Litkevich Yuriy, ок


заработало только в таком виде:

Цитата(igor_bogomolov @ 6.2.2011, 1:30) *
CONFIG (debug|release) {...}


поэтому так осталось и непонятным, почему у Игоря в скобках написано "debug, debug|release"

Автор: Litkevich Yuriy 6.2.2011, 12:28

Цитата(Алексей1153 @ 6.2.2011, 13:41) *
почему у Игоря в скобках написано "debug, debug|release"
выбирается один элемент из списка
Список содержит элементы debug и release

а у тебя получается бессмысленная запись, всё равно, что ты её не писал


Автор: Алексей1153 6.2.2011, 13:12

факт остаётся фактом - только с моим вариантом заработало так, как надо. Без условия - тоже не так работает.

Хотя, ничего не утверждаю, попозже поэкспериментирую точно. Сейчас немного некогда, а компилируется каждый раз очень долго на моём калькуляторе :) А пока "работает и так", эхъ

Автор: igor_bogomolov 6.2.2011, 14:24

Алексей1153, почему бы просто не посмотреть документацию http://www.doc.crossplatform.ru/qt/4.6.x/qmake-variable-reference.html#config

Автор: Алексей1153 6.2.2011, 14:33

мдяя, достаточно мутная дока. С ходу не смог осилить (а про условное определение там вообще ровно один абзац с одним примером без особых объяснений)

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)