Russian Qt Forum

Qt => Qt-инструментарий => Тема начата: QtProger от Январь 04, 2010, 15:58



Название: В разных IDE разные файлы проектов...
Отправлено: QtProger от Январь 04, 2010, 15:58
Помогите разобраться. Я решил испробовать Qt на других IDE. Попробовал сначала с Code::Blocks - с ним не получилось скомпилировать проект, мне сказали,что надо использовать makefile, не знаю что это такое и зачем он нужен. Попробовал Visual Studio: в ней используется файл проекта *.vcproj. А в Creator`е файлы проекта *.pro.
Подскажите, пожалуйста, что мне делать с этим разнообразием ? Как мне скомпилировать в Creator`e проект, созданный в Visual Studio, и наоборот ? Как мне скомпилировать в Code::Blocks проект, созданный в Creator`e ?


Название: Re: В разных IDE разные файлы проектов...
Отправлено: niXman от Январь 04, 2010, 16:35
cmake


Название: Re: В разных IDE разные файлы проектов...
Отправлено: Dendy от Январь 04, 2010, 16:41
cmake

Плюсую. Только вот человек ринулся кодить, а что такое Makefile даже не представляет. Боюсь с CMake'ом вообще увязнет. А так да - читайте документацию по CMake и создавайте Makefile-проекты в каждом из IDE.


Название: Re: В разных IDE разные файлы проектов...
Отправлено: panAlexey от Январь 04, 2010, 17:14
Помогите разобраться. Я решил испробовать Qt на других IDE. Попробовал сначала с Code::Blocks - с ним не получилось скомпилировать проект, мне сказали,что надо использовать makefile, не знаю что это такое и зачем он нужен.
Гуглом воспользуйся.
Первое что нашлось: http://abuse.edu.ioffe.ru/cluster/makeman
пс. хе-хе :))) рекомендуют использовать кодеблок и эклипЗ, :)) шобы окончательно заэклипсело :)))))))

Помогите разобраться. >>>>>>. мне сказали,что надо использовать makefile, не знаю что это такое и зачем он нужен.
Лучше бы тебе не хвататься за ИДЕ, прежде чем поймешь че такое makefile и как работает система сборки/линковки/компиляции.


Название: Re: В разных IDE разные файлы проектов...
Отправлено: QtProger от Январь 04, 2010, 19:37
Плюсую. Только вот человек ринулся кодить, а что такое Makefile даже не представляет. Боюсь с CMake'ом вообще увязнет. А так да - читайте документацию по CMake и создавайте Makefile-проекты в каждом из IDE.

Значит makefile и Cmake - решение проблем, описанных в первом посту ? С makefile и Cmake мои проекты станут кросс-IDE`шными ?

Лучше бы тебе не хвататься за ИДЕ, прежде чем поймешь че такое makefile и как работает система сборки/линковки/компиляции.

Поздно. Уже больше полугода прогаю в IDE  :) Сначала была Делфи, потом С++ Билдер. Со словом "makefile" познакомился недавно.


Название: Re: В разных IDE разные файлы проектов...
Отправлено: Dendy от Январь 04, 2010, 19:49
Да, Makefile-проекты - решение ваших проблем. Есть множество утилит, генерирующих Makefile под платформу из кроссплатформенного файла проекта (QMake, CMake, autotools, etc). Естественно у каждой системы сборки свой формат файла. На сегодняшний день наиболее популярным и богатым возможностями является CMake. Вот небольшие статьи на Вики, которые помогут дать старт:

CMake как система сборки для Qt приложений (http://prog.org.ru/wiki/index.php?title=CMake_%D0%BA%D0%B0%D0%BA_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D1%81%D0%B1%D0%BE%D1%80%D0%BA%D0%B8_%D0%B4%D0%BB%D1%8F_Qt_%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9)
Интеграция CMake с различными IDE (http://prog.org.ru/wiki/index.php?title=%D0%98%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D1%8F_CMake_%D1%81_%D1%80%D0%B0%D0%B7%D0%BB%D0%B8%D1%87%D0%BD%D1%8B%D0%BC%D0%B8_IDE)


Название: Re: В разных IDE разные файлы проектов...
Отправлено: niXman от Январь 04, 2010, 20:15
я в основном прогаю для линукс. но бывает что проект требует кроссплатформености.
в общем, для большинства проектов использую qmake. как ни странно ;)
а что еще нужно?
он умеет:
1. генерить платформонезависимые makefile-ы
2. проекты для микрософт студии.

никаких проблем.


Название: Re: В разных IDE разные файлы проектов...
Отправлено: break от Январь 05, 2010, 01:06
Цитировать
я в основном прогаю для линукс. но бывает что проект требует кроссплатформености.
Аналогично - и возможно для новичка будет быстрее разобраться...


Название: Re: В разных IDE разные файлы проектов...
Отправлено: QtProger от Январь 05, 2010, 15:01
Что лучше выбрать, CMake или QMake ?  ???


Название: Re: В разных IDE разные файлы проектов...
Отправлено: BRE от Январь 05, 2010, 15:03
Что лучше выбрать, CMake или QMake ?  ???
В проекте будут сторонние библиотеки кроме Qt?
Проект будет распространяться и на каких платформах?
В каком виде будет распространяться?


Название: Re: В разных IDE разные файлы проектов...
Отправлено: QtProger от Январь 05, 2010, 15:16
В проекте будут сторонние библиотеки кроме Qt?

Не знаю. :-\ Может будут. Я только начал изучать Qt, пока плохо понимаю что к чему.

Проект будет распространяться и на каких платформах?

На всех возможных платформах.  :)

В каком виде будет распространяться?

Во всех возможных видах. :)  В виде бинарников, в виде исходников и прочих возможных видах, если они существуют.  :)


Название: Re: В разных IDE разные файлы проектов...
Отправлено: BRE от Январь 05, 2010, 15:21
Тогда спокойно используй qmake.
А вот когда возникнет потребность или qmake станет плохо справляться с задачами проекта, то переведешь его на CMake (или аналогичное).


Название: Re: В разных IDE разные файлы проектов...
Отправлено: QtProger от Январь 05, 2010, 15:27
Тогда спокойно используй qmake.
А вот когда возникнет потребность или qmake станет плохо справляться с задачами проекта, то переведешь его на CMake (или аналогичное).

С какими задачами QMake плохо справляется ?


Название: Re: В разных IDE разные файлы проектов...
Отправлено: BRE от Январь 05, 2010, 15:45
С какими задачами QMake плохо справляется ?
Она не может находить и конфигурировать сторонние библиотеки.


Название: Re: В разных IDE разные файлы проектов...
Отправлено: QtProger от Январь 05, 2010, 16:03
Можно попробовать начать с QMake. Получать с ним мейкфайлы я вроде умею.
В консоли ввожу команду qmake first.pro и получаю три файла:
Makefile.Debug
Makefile.Release
Makefile
Как мне с этими мейкфайлами открыть проект в Visual Studio ?


Название: Re: В разных IDE разные файлы проектов...
Отправлено: Karl-Philipp от Январь 05, 2010, 16:21
Цитата: Assistant
Creating Visual Studio Project Files

Developers using Visual Studio to write Qt applications can use the Visual Studio integration facilities provided with the Qt Commercial Editions and do not need to worry about how project dependencies are managed.

However, some developers may need to import an existing qmake project into Visual Studio. qmake is able to take a project file and create a Visual Studio project that contains all the necessary information required by the development environment. This is achieved by setting the qmake project template to either vcapp (for application projects) or vclib (for library projects).

This can also be set using a command line option, for example:

 qmake -tp vc
It is possible to recursively generate .vcproj files in subdirectories and a .sln file in the main directory, by typing:

 qmake -tp vc -r
Each time you update the project file, you need to run qmake to generate an updated Visual Studio project.

Note: If you are using the Visual Studio Add-in, you can import .pro files via the Qt->Import from .pro file menu item.


Название: Re: В разных IDE разные файлы проектов...
Отправлено: Dendy от Январь 05, 2010, 17:55
QMake совершенно не годится для Makefile-проектов как минимум потому, что не умеет разрешать зависимости между исходниками. Он не генерирует отдельный файл с зависимостями, а хардкодит их прямо в Makefile, который, естественно не пересоздайтся при смене зависимостей между исходными файлами. Как следствие - проект после нескольких сборок или:

1) Перестанет собираться вообще, прийдётся руками делать make clean. Это лучший вариант развития событий.
2) Соберётся, но не будет запускаться. Это тоже неплохо, так как вы сразу будете знать, что Makefile глюкнул.
3) Соберётся, будет запускаться, но работать неправильно. И вы в жизни не поймёте почему именно.

Эта проблема была три года назад, есть она и сейчас. Воспроизвести элементарно:

1. Создаём файлы:

main.cpp
Код
C++ (Qt)
int main( int argc, char ** argv )
{
   return 0;
}
 

broken.pro
Код
C++ (Qt)
CONFIG += console
SOURCES += main.cpp
 

2. Выполняем:

$ qmake
$ make
$ broken

Всё собирается и отлично работает. Ещё бы. Идём дальше.

3. Добавляем третий файл:

broken.h
Код
C++ (Qt)
#include <stdio.h>
 
inline void printSomething()
{
   printf( "Hello!\n" );
}
 

И подключаем его к main.cpp:

main.cpp
Код
C++ (Qt)
#include "broken.h"
 
int main( int argc, char ** argv )
{
   printSomething();
   return 0;
}
 

4. Собираем:

$ make
$ broken
> Hello!

Отлично, работает. Идём дальше.

5. Меняем текст в broken.h:

broken.h
Код
C++ (Qt)
#include <stdio.h>
 
inline void printSomething()
{
   printf( "Goodbye!\n" );
}
 

6. И собираем проект:

$ make
$ broken
> Hello!

О Боги! Как такое могло случиться!

И это самый тривиальный пример. В реальной жизни ошибки могут быть такими, что вы их и не отследите. А каждый раз чистить проект или прогонять qmake - это огромный удар по скорости сборки. Так как qmake работает неинкрементально, он каждый раз собирает информацию о проекте и всё заталкивает в один Makefile, вырастающий порой как на дрожжах до мегабайтных размеров. Всё на что годится qmake - собрать пустой проект один раз и проинсталировать его. Для инкрементальной сборки он не годится.

Мой совет: изучайте CMake. Там всё просто. Выше дал ссылки на статьи в Вики.


Название: Re: В разных IDE разные файлы проектов...
Отправлено: lit-uriy от Январь 05, 2010, 18:16
Dendy, в примере не понял п.2 строчку:
$ broken
что она делает? это имя проекта и как следствие бинаря?

Виндовозе описанное не произойдёт, по крайней мере если broken.h будет указан в переменной HEADERS, в pro-файле Слежение за изменениями ведёт сам make-файл, и вызовет перекомпиляцию main.cpp.


Название: Re: В разных IDE разные файлы проектов...
Отправлено: Dendy от Январь 05, 2010, 18:53
broken - имя запускаемого файла (совпадает с именем pro-файла). Весь эксперимент проводился именно в Windows. Добавление HEADERS += broken.h не меняет ровным счётом ничего.

lit-uriy, перед тем как что-то утверждать рекомендую хотя бы проверить самому.


Название: Re: В разных IDE разные файлы проектов...
Отправлено: igor_bogomolov от Январь 05, 2010, 19:07
Добавление HEADERS += broken.h не меняет ровным счётом ничего.
Попробовал сам. Добавление  HEADERS += broken.h решает описанную выше проблему.


Название: Re: В разных IDE разные файлы проектов...
Отправлено: BRE от Январь 05, 2010, 19:09
Попробовал сам. Добавление  HEADERS += broken.h решает описанную выше проблему.
Значит поправили.


Название: Re: В разных IDE разные файлы проектов...
Отправлено: lit-uriy от Январь 05, 2010, 19:11
Dendy у меня такой проблемы нет. Есть один проект, в котором есть файл global.h он включен в несколько cpp-файлов. При изменении в нём и последующем:
make debug
все эти cpp-файлы перекомпилируются. Т.к. зависимости в make-файле есть:
Цитировать
../tmp/debug/pwr_curent.o: pwr_curent.cpp global.h \
      pwr_curent.h \
      ../tmp/uic/ui_pwr_curent.h \
      ../3rdparty/TableViewBuddy/tableviewbuddy.h
   $(CXX) -c $(CXXFLAGS) $(INCPATH) -o ..\tmp\debug\pwr_curent.o pwr_curent.cpp


Название: Re: В разных IDE разные файлы проектов...
Отправлено: Alex Custov от Январь 05, 2010, 19:25
broken - имя запускаемого файла (совпадает с именем pro-файла). Весь эксперимент проводился именно в Windows. Добавление HEADERS += broken.h не меняет ровным счётом ничего.

если использовать DEPENDPATH, то изменения файлов отслеживаются. Тот случай что ты описал происходит тогда, когда DEPENDPATH не используется.


Название: Re: В разных IDE разные файлы проектов...
Отправлено: BRE от Январь 05, 2010, 19:29
На сколько я помню, в qmake есть (были?) и другие проблемы.
В проектах где файлы имеют одинаковые имена, но лежат по разным папкам.
Например:
/project
   /lib1
      /func.cpp
   /lib2
      /func.cpp
   /main.cpp

test.pro
Цитировать
TEMPLATE = app
SOURCES += main.cpp lib1/func.cpp lib2/func.cpp

Вот с файлом func.o начнутся проблемы, т.к. в makefile будет две цели на создание func.o и одна из них будет игнорироваться.


Название: Re: В разных IDE разные файлы проектов...
Отправлено: niXman от Январь 05, 2010, 19:29
.pro файлы нужно писать правильно.


Название: Re: В разных IDE разные файлы проектов...
Отправлено: BRE от Январь 05, 2010, 19:35
.pro файлы нужно писать правильно.
Возможно. Я использую qmake только для тестовых примерчиков.


Название: Re: В разных IDE разные файлы проектов...
Отправлено: Dendy от Январь 05, 2010, 19:39
Очевидно некоторые так ничего и не поняли. Проблема есть у всех. Повторяю ещё раз. Выполнение команды qmake до добавления #include "broken.h" ведёт к сломанной зависимости. Дело не в версии Qt, я проверял только что на Qt 4.6.0.

Немного сократил. Делать исключительно по шагам, без самодеятельности.

1. Создаём три файла:

broken.h
Код
C++ (Qt)
#include <stdio.h>
 
inline void printSomething()
{
   printf( "Hello!\n" );
}

main.cpp
Код
C++ (Qt)
int main( int argc, char ** argv )
{
   return 0;
}

broken.pro
Код
C++ (Qt)
CONFIG += console
HEADERS += broken.h
SOURCES += main.cpp

$ qmake
$ make
$ broken

2. Подключаем к main.cpp broken.h:

main.cpp
Код
C++ (Qt)
#include "broken.h"
 
int main( int argc, char ** argv )
{
   printSomething();
   return 0;
}

$ make
$ broken
> Hello!

3. Меняем строку в broken.h:


broken.h
Код
C++ (Qt)
#include <stdio.h>
 
inline void printSomething()
{
   printf( "Goodbye!\n" );
}

$ make
$ broken
> Hello!

Всем задание на дом: а) воспроизвести, б) подумать почему так происходит.


Название: Re: В разных IDE разные файлы проектов...
Отправлено: Dendy от Январь 05, 2010, 19:46
если использовать DEPENDPATH, то изменения файлов отслеживаются. Тот случай что ты описал происходит тогда, когда DEPENDPATH не используется.

Ошибаетесь, DEPENDPATH - тайное знание QMake, существует только для того, чтобы подсказать последнему где искать подключаемые файлы. На возможность пересоздавать зависимости при редактировании исходных файлов не влияет.


Название: Re: В разных IDE разные файлы проектов...
Отправлено: Авварон от Январь 05, 2010, 19:51
мне всегда казалось, что для того в мейкфайле и нужны зависимости у цели, чтобы перекомпиливать только то, что надо


Название: Re: В разных IDE разные файлы проектов...
Отправлено: Alex Custov от Январь 05, 2010, 19:56
если использовать DEPENDPATH, то изменения файлов отслеживаются. Тот случай что ты описал происходит тогда, когда DEPENDPATH не используется.

Ошибаетесь, DEPENDPATH - тайное знание QMake, существует только для того, чтобы подсказать последнему где искать подключаемые файлы. На возможность пересоздавать зависимости при редактировании исходных файлов не влияет.

Собственно, с HEADERS += broken.h всё работает.


Название: Re: В разных IDE разные файлы проектов...
Отправлено: Dendy от Январь 05, 2010, 19:58
Собственно, с HEADERS += broken.h всё работает.

Воспроизводили строго по шагам с нуля?


Название: Re: В разных IDE разные файлы проектов...
Отправлено: Авварон от Январь 05, 2010, 20:00
таки не работает
MacBook-arch:test arch$ touch broken.h
MacBook-arch:test arch$ make
make: Nothing to be done for `first'.

и в мейкфайле я вообще не нашел упоминаний broken.h, то есть хедеры не входят в зависимости сорцов. Бред


Название: Re: В разных IDE разные файлы проектов...
Отправлено: lit-uriy от Январь 05, 2010, 20:02
BRE, с одинаковыми именами, по моему до сих пор актуально


Название: Re: В разных IDE разные файлы проектов...
Отправлено: Авварон от Январь 05, 2010, 20:06
а, таки поправка...
1й вариант:
Код:
compiler_moc_header_clean:
MacBook-arch:test arch$ cat Makefile | grep broken.h
$(COPY_FILE) --parents $(SOURCES) $(DIST) .tmp/broken1.0.0/ && $(COPY_FILE) --parents broken.h .tmp/broken1.0.0/ && $(COPY_FILE) --parents main.cpp .tmp/broken1.0.0/ && (cd `dirname .tmp/broken1.0.0` && $(TAR) broken1.0.0.tar broken1.0.0 && $(COMPRESS) broken1.0.0.tar) && $(MOVE) `dirname .tmp/broken1.0.0`/broken1.0.0.tar.gz . && $(DEL_FILE) -r .tmp/broken1.0.0
2й вариант
Код:
MacBook-arch:test arch$ /usr/local/Trolltech/Qt-4.6.0/bin/qmake 
MacBook-arch:test arch$ cat Makefile | grep broken.h
$(COPY_FILE) --parents $(SOURCES) $(DIST) .tmp/broken1.0.0/ && $(COPY_FILE) --parents broken.h .tmp/broken1.0.0/ && $(COPY_FILE) --parents main.cpp .tmp/broken1.0.0/ && (cd `dirname .tmp/broken1.0.0` && $(TAR) broken1.0.0.tar broken1.0.0 && $(COMPRESS) broken1.0.0.tar) && $(MOVE) `dirname .tmp/broken1.0.0`/broken1.0.0.tar.gz . && $(DEL_FILE) -r .tmp/broken1.0.0
[b]main.o: main.cpp broken.h[/b]
то есть qmake наоборот, считает себя слишком умным. Осталось проверить еще одну вещь: после запуска qmake будет ли идти полная пересборка проекта, или только тех исходников, время изменения которых больше чем объектников. Если вариант 2й, то qmake всё делает правильно


Название: Re: В разных IDE разные файлы проектов...
Отправлено: Dendy от Январь 05, 2010, 20:08
Авварон, вот именно. Перегенерация зависимостей при редактировании исходных файлов отсутствует напрочь. В результате возможен случай когда вы отредактируете что-то в заголовочнике, а перекомпилируется только часть исходников, включающих этот заголовочник. В итоге программа или не скомпилируется или не слинкуется или не запустится или запустится, но результат будет непредсказуем.


Название: Re: В разных IDE разные файлы проектов...
Отправлено: lit-uriy от Январь 05, 2010, 20:10
>>после запуска qmake будет ли идти полная пересборка проекта, или только тех исходников, время изменения которых больше чем объектников.

У меня именно так.

Мало того, если я изменил pro-файл, то мне не надо делать qmake, он вызывается сам.
Единственное неудобство - нужно делать вручную qmake, если я добавил макрос Q_OBJECT. Поэтому я его всегда пишу для наследников QObject (как и рекомендовано в асистенте)


Название: Re: В разных IDE разные файлы проектов...
Отправлено: Авварон от Январь 05, 2010, 20:13
разговор идет вне креатора, там как раз всё здорово и красиво. Проверьте кто-нить про пересборку... Кстати, как указать, чтобы при изменении статической библиотеки пересобиралось приложение, ее использующее...


Название: Re: В разных IDE разные файлы проектов...
Отправлено: Dendy от Январь 05, 2010, 20:15
Вызывать каждый раз qmake перед make - совершенно не вариант, так как скорость генерации Makefile'а растёт пропорционально количеству исходников. Я работаю далеко не за худшим компьютером - Core 2 Quad E8200 (2.33 GHz per core). Только что замерил генерацию Makefile для Qt gui.pro: чистый проход qmake 21 секунда.


Название: Re: В разных IDE разные файлы проектов...
Отправлено: SABROG от Январь 05, 2010, 21:11
В общем попробовал воспроизвести с MinGW на WinXP Qt 4.6.0. Сразу увидел, что в Makefile'е напрочь отсутствует информация о файле broken.h хоть пиши HEADERS += broken.h, хоть не пиши. На предпоследнем шаге, когда надо изменить строчку в broken.h с Hello на Goodbye, mingw32-make пишет просто:

Код:
>mingw32-make
mingw32-make -f Makefile.Debug
mingw32-make[1]: Entering directory `D:/Work/broken'
mingw32-make[1]: Nothing to be done for `first'.
mingw32-make[1]: Leaving directory `D:/Work/broken'

Т.е. он не видит вообще изменения в .h файлах, туда хоть мусор запихни, до mingw32-make clean && mingw32-make ничего не изменится.

В документации к переменной HEADERS написано:

Цитировать
qmake will generate dependency information (unless -nodepend is specified on the command line) for the specified headers. qmake will also automatically detect if moc is required by the classes in these headers, and add the appropriate dependencies and files to the project for generating and linking the moc files.

Но ничего не генерится, значит баг.


Название: Re: В разных IDE разные файлы проектов...
Отправлено: niXman от Январь 05, 2010, 21:12
все работает. линукс.


Название: Re: В разных IDE разные файлы проектов...
Отправлено: SABROG от Январь 05, 2010, 21:15
Вот мой Makefile с первого запуска qmake, когда в .pro файле прописан HEADERS. Ни слова про broken.h:

Код:
#############################################################################
# Makefile for building: broken
# Generated by qmake (2.01a) (Qt 4.6.0) on: ?? 5. ??? 20:54:56 2010
# Project:  broken.pro
# Template: app
#############################################################################

####### Compiler, tools and options

CC            = gcc
CXX           = g++
DEFINES       = -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT
CFLAGS        = -g -Wall $(DEFINES)
CXXFLAGS      = -g -frtti -fexceptions -mthreads -Wall $(DEFINES)
INCPATH       = -I"..\qt-everywhere-opensource-src-4.6.0\include\QtCore" -I"..\qt-everywhere-opensource-src-4.6.0\include\QtGui" -I"..\qt-everywhere-opensource-src-4.6.0\include" -I"..\qt-everywhere-opensource-src-4.6.0\include\ActiveQt" -I"debug" -I"..\qt-everywhere-opensource-src-4.6.0\mkspecs\win32-g++"
LINK        =        g++
LFLAGS        =        -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -Wl,-subsystem,console -mthreads -Wl
LIBS        =        -L"d:\Work\qt-everywhere-opensource-src-4.6.0\lib" -lQtGuid4 -lQtCored4
QMAKE         = d:\Work\qt-everywhere-opensource-src-4.6.0\bin\qmake.exe
IDC           = d:\Work\qt-everywhere-opensource-src-4.6.0\bin\idc.exe
IDL           = midl
ZIP           = zip -r -9
DEF_FILE      =
RES_FILE      =
COPY          = copy /y
COPY_FILE     = $(COPY)
COPY_DIR      = xcopy /s /q /y /i
DEL_FILE      = del
DEL_DIR       = rmdir
MOVE          = move
CHK_DIR_EXISTS= if not exist
MKDIR         = mkdir
INSTALL_FILE    = $(COPY_FILE)
INSTALL_PROGRAM = $(COPY_FILE)
INSTALL_DIR     = $(COPY_DIR)

####### Output directory

OBJECTS_DIR   = debug

####### Files

SOURCES       = main.cpp
OBJECTS       = debug/main.o
DIST          =
QMAKE_TARGET  = broken
DESTDIR        = debug\ #avoid trailing-slash linebreak
TARGET         = broken.exe
DESTDIR_TARGET = debug\broken.exe

####### Implicit rules

.SUFFIXES: .cpp .cc .cxx .c

.cpp.o:
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<

.cc.o:
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<

.cxx.o:
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<

.c.o:
$(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<

####### Build rules

first: all
all: Makefile.Debug  $(DESTDIR_TARGET)

$(DESTDIR_TARGET):  $(OBJECTS)
$(LINK) $(LFLAGS) -o $(DESTDIR_TARGET) $(OBJECTS)  $(LIBS)


qmake:  FORCE
@$(QMAKE) -win32 -o Makefile.Debug broken.pro

dist:
$(ZIP) broken.zip $(SOURCES) $(DIST) broken.pro ..\qt-everywhere-opensource-src-4.6.0\mkspecs\qconfig.pri ..\qt-everywhere-opensource-src-4.6.0\mkspecs\features\qt_functions.prf ..\qt-everywhere-opensource-src-4.6.0\mkspecs\features\qt_config.prf ..\qt-everywhere-opensource-src-4.6.0\mkspecs\features\exclusive_builds.prf ..\qt-everywhere-opensource-src-4.6.0\mkspecs\features\default_pre.prf ..\qt-everywhere-opensource-src-4.6.0\mkspecs\features\win32\default_pre.prf ..\qt-everywhere-opensource-src-4.6.0\mkspecs\features\debug.prf ..\qt-everywhere-opensource-src-4.6.0\mkspecs\features\debug_and_release.prf ..\qt-everywhere-opensource-src-4.6.0\mkspecs\features\default_post.prf ..\qt-everywhere-opensource-src-4.6.0\mkspecs\features\win32\default_post.prf ..\qt-everywhere-opensource-src-4.6.0\mkspecs\features\build_pass.prf ..\qt-everywhere-opensource-src-4.6.0\mkspecs\features\win32\console.prf ..\qt-everywhere-opensource-src-4.6.0\mkspecs\features\win32\rtti.prf ..\qt-everywhere-opensource-src-4.6.0\mkspecs\features\win32\exceptions.prf ..\qt-everywhere-opensource-src-4.6.0\mkspecs\features\win32\stl.prf ..\qt-everywhere-opensource-src-4.6.0\mkspecs\features\shared.prf ..\qt-everywhere-opensource-src-4.6.0\mkspecs\features\warn_on.prf ..\qt-everywhere-opensource-src-4.6.0\mkspecs\features\qt.prf ..\qt-everywhere-opensource-src-4.6.0\mkspecs\features\win32\thread.prf ..\qt-everywhere-opensource-src-4.6.0\mkspecs\features\moc.prf ..\qt-everywhere-opensource-src-4.6.0\mkspecs\features\resources.prf ..\qt-everywhere-opensource-src-4.6.0\mkspecs\features\uic.prf ..\qt-everywhere-opensource-src-4.6.0\mkspecs\features\yacc.prf ..\qt-everywhere-opensource-src-4.6.0\mkspecs\features\lex.prf ..\qt-everywhere-opensource-src-4.6.0\mkspecs\features\include_source_dir.prf  HEADERS RESOURCES IMAGES SOURCES OBJECTIVE_SOURCES FORMS YACCSOURCES YACCSOURCES LEXSOURCES

clean: compiler_clean
-$(DEL_FILE) debug\main.o

distclean: clean
-$(DEL_FILE) $(DESTDIR_TARGET)
-$(DEL_FILE) Makefile.Debug

mocclean: compiler_moc_header_clean compiler_moc_source_clean

mocables: compiler_moc_header_make_all compiler_moc_source_make_all

compiler_moc_header_make_all:
compiler_moc_header_clean:
compiler_rcc_make_all:
compiler_rcc_clean:
compiler_image_collection_make_all: qmake_image_collection.cpp
compiler_image_collection_clean:
-$(DEL_FILE) qmake_image_collection.cpp
compiler_moc_source_make_all:
compiler_moc_source_clean:
compiler_uic_make_all:
compiler_uic_clean:
compiler_yacc_decl_make_all:
compiler_yacc_decl_clean:
compiler_yacc_impl_make_all:
compiler_yacc_impl_clean:
compiler_lex_make_all:
compiler_lex_clean:
compiler_clean:



####### Compile

debug/main.o: main.cpp
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o debug\main.o main.cpp

####### Install

install:   FORCE

uninstall:   FORCE

FORCE:


Если закомментировать инклуд:

Код
C++ (Qt)
//#include "broken.h"
 
int main( int argc, char ** argv )
 

Затем сделать qmake, то makefile создается без файла broken.h. Если раскомментировать и снова сделать qmake, то в makefile появляется broken.h. Т.е. qmake лазит по исходникам и выцепляет зависимости, а флаг HEADERS при этом игнорит.


Название: Re: В разных IDE разные файлы проектов...
Отправлено: niXman от Январь 05, 2010, 21:28
а вот мой. в конце смотрим внимательно. вопросы?
Код
INI
#############################################################################
# Makefile for building: test
# Generated by qmake (2.01a) (Qt 4.6.0) on: ?? ???. 5 21:26:53 2010
# Project:  test.pro
# Template: app
# Command: /home/nixman/qtsdk-2009.05/qt/bin/qmake -unix -o Makefile test.pro
#############################################################################
 
####### Compiler, tools and options
 
CC            = gcc
CXX           = g++
DEFINES       = -DQT_NO_DEBUG -DQT_CORE_LIB -DQT_SHARED
CFLAGS        = -pipe -O2 -Wall -W -D_REENTRANT $(DEFINES)
CXXFLAGS      = -pipe -std=c++0x -O2 -Wall -W -D_REENTRANT $(DEFINES)
INCPATH       = -I../qtsdk-2009.05/qt/mkspecs/linux-g++ -I. -I../qtsdk-2009.05/qt/include/QtCore -I../qtsdk-2009.05/qt/include -I.
LINK          = g++
LFLAGS        = -Wl,-O1 -Wl,-rpath,/home/nixman/qtsdk-2009.05/qt/lib
LIBS          = $(SUBLIBS)  -L/home/nixman/qtsdk-2009.05/qt/lib -lboost_system -lQtCore -L/home/nixman/qtsdk-2009.05/qt/lib -lpthread
AR            = ar cqs
RANLIB        =
QMAKE         = /home/nixman/qtsdk-2009.05/qt/bin/qmake
TAR           = tar -cf
COMPRESS      = gzip -9f
COPY          = cp -f
SED           = sed
COPY_FILE     = $(COPY)
COPY_DIR      = $(COPY) -r
STRIP         = strip
INSTALL_FILE  = install -m 644 -p
INSTALL_DIR   = $(COPY_DIR)
INSTALL_PROGRAM = install -m 755 -p
DEL_FILE      = rm -f
SYMLINK       = ln -sf
DEL_DIR       = rmdir
MOVE          = mv -f
CHK_DIR_EXISTS= test -d
MKDIR         = mkdir -p
 
####### Output directory
 
OBJECTS_DIR   = ./
 
####### Files
 
SOURCES       = main.cpp
OBJECTS       = main.o
DIST          = ../qtsdk-2009.05/qt/mkspecs/common/g++.conf \
../qtsdk-2009.05/qt/mkspecs/common/unix.conf \
../qtsdk-2009.05/qt/mkspecs/common/linux.conf \
../qtsdk-2009.05/qt/mkspecs/qconfig.pri \
../qtsdk-2009.05/qt/mkspecs/features/qt_functions.prf \
../qtsdk-2009.05/qt/mkspecs/features/qt_config.prf \
../qtsdk-2009.05/qt/mkspecs/features/exclusive_builds.prf \
../qtsdk-2009.05/qt/mkspecs/features/default_pre.prf \
../qtsdk-2009.05/qt/mkspecs/features/release.prf \
../qtsdk-2009.05/qt/mkspecs/features/default_post.prf \
../qtsdk-2009.05/qt/mkspecs/features/warn_on.prf \
../qtsdk-2009.05/qt/mkspecs/features/qt.prf \
../qtsdk-2009.05/qt/mkspecs/features/unix/thread.prf \
../qtsdk-2009.05/qt/mkspecs/features/moc.prf \
../qtsdk-2009.05/qt/mkspecs/features/resources.prf \
../qtsdk-2009.05/qt/mkspecs/features/uic.prf \
../qtsdk-2009.05/qt/mkspecs/features/yacc.prf \
../qtsdk-2009.05/qt/mkspecs/features/lex.prf \
../qtsdk-2009.05/qt/mkspecs/features/include_source_dir.prf \
test.pro
QMAKE_TARGET  = test
DESTDIR       =
TARGET        = test
 
first: all
####### Implicit rules
 
.SUFFIXES: .o .c .cpp .cc .cxx .C
 
.cpp.o:
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
 
.cc.o:
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
 
.cxx.o:
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
 
.C.o:
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
 
.c.o:
$(CC) -c $(CFLAGS) $(INCPATH) -o "$@" "$<"
 
####### Build rules
 
all: Makefile $(TARGET)
 
$(TARGET):  $(OBJECTS)  
$(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS)
 
Makefile: test.pro  ../qtsdk-2009.05/qt/mkspecs/linux-g++/qmake.conf ../qtsdk-2009.05/qt/mkspecs/common/g++.conf \
../qtsdk-2009.05/qt/mkspecs/common/unix.conf \
../qtsdk-2009.05/qt/mkspecs/common/linux.conf \
../qtsdk-2009.05/qt/mkspecs/qconfig.pri \
../qtsdk-2009.05/qt/mkspecs/features/qt_functions.prf \
../qtsdk-2009.05/qt/mkspecs/features/qt_config.prf \
../qtsdk-2009.05/qt/mkspecs/features/exclusive_builds.prf \
../qtsdk-2009.05/qt/mkspecs/features/default_pre.prf \
../qtsdk-2009.05/qt/mkspecs/features/release.prf \
../qtsdk-2009.05/qt/mkspecs/features/default_post.prf \
../qtsdk-2009.05/qt/mkspecs/features/warn_on.prf \
../qtsdk-2009.05/qt/mkspecs/features/qt.prf \
../qtsdk-2009.05/qt/mkspecs/features/unix/thread.prf \
../qtsdk-2009.05/qt/mkspecs/features/moc.prf \
../qtsdk-2009.05/qt/mkspecs/features/resources.prf \
../qtsdk-2009.05/qt/mkspecs/features/uic.prf \
../qtsdk-2009.05/qt/mkspecs/features/yacc.prf \
../qtsdk-2009.05/qt/mkspecs/features/lex.prf \
../qtsdk-2009.05/qt/mkspecs/features/include_source_dir.prf \
/home/nixman/qtsdk-2009.05/qt/lib/libQtCore.prl
$(QMAKE) -unix -o Makefile test.pro
../qtsdk-2009.05/qt/mkspecs/common/g++.conf:
../qtsdk-2009.05/qt/mkspecs/common/unix.conf:
../qtsdk-2009.05/qt/mkspecs/common/linux.conf:
../qtsdk-2009.05/qt/mkspecs/qconfig.pri:
../qtsdk-2009.05/qt/mkspecs/features/qt_functions.prf:
../qtsdk-2009.05/qt/mkspecs/features/qt_config.prf:
../qtsdk-2009.05/qt/mkspecs/features/exclusive_builds.prf:
../qtsdk-2009.05/qt/mkspecs/features/default_pre.prf:
../qtsdk-2009.05/qt/mkspecs/features/release.prf:
../qtsdk-2009.05/qt/mkspecs/features/default_post.prf:
../qtsdk-2009.05/qt/mkspecs/features/warn_on.prf:
../qtsdk-2009.05/qt/mkspecs/features/qt.prf:
../qtsdk-2009.05/qt/mkspecs/features/unix/thread.prf:
../qtsdk-2009.05/qt/mkspecs/features/moc.prf:
../qtsdk-2009.05/qt/mkspecs/features/resources.prf:
../qtsdk-2009.05/qt/mkspecs/features/uic.prf:
../qtsdk-2009.05/qt/mkspecs/features/yacc.prf:
../qtsdk-2009.05/qt/mkspecs/features/lex.prf:
../qtsdk-2009.05/qt/mkspecs/features/include_source_dir.prf:
/home/nixman/qtsdk-2009.05/qt/lib/libQtCore.prl:
qmake:  FORCE
@$(QMAKE) -unix -o Makefile test.pro
 
dist:
@$(CHK_DIR_EXISTS) .tmp/test1.0.0 || $(MKDIR) .tmp/test1.0.0
$(COPY_FILE) --parents $(SOURCES) $(DIST) .tmp/test1.0.0/ && $(COPY_FILE) --parents main.h .tmp/test1.0.0/ && $(COPY_FILE) --parents main.cpp .tmp/test1.0.0/ && (cd `dirname .tmp/test1.0.0` && $(TAR) test1.0.0.tar test1.0.0 && $(COMPRESS) test1.0.0.tar) && $(MOVE) `dirname .tmp/test1.0.0`/test1.0.0.tar.gz . && $(DEL_FILE) -r .tmp/test1.0.0
 
 
clean:compiler_clean
-$(DEL_FILE) $(OBJECTS)
-$(DEL_FILE) *~ core *.core
 
 
####### Sub-libraries
 
distclean: clean
-$(DEL_FILE) $(TARGET)
-$(DEL_FILE) Makefile
 
 
mocclean: compiler_moc_header_clean compiler_moc_source_clean
 
mocables: compiler_moc_header_make_all compiler_moc_source_make_all
 
compiler_moc_header_make_all:
compiler_moc_header_clean:
compiler_rcc_make_all:
compiler_rcc_clean:
compiler_image_collection_make_all: qmake_image_collection.cpp
compiler_image_collection_clean:
-$(DEL_FILE) qmake_image_collection.cpp
compiler_moc_source_make_all:
compiler_moc_source_clean:
compiler_uic_make_all:
compiler_uic_clean:
compiler_yacc_decl_make_all:
compiler_yacc_decl_clean:
compiler_yacc_impl_make_all:
compiler_yacc_impl_clean:
compiler_lex_make_all:
compiler_lex_clean:
compiler_clean:
 
####### Compile
 
main.o: main.cpp main.h
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o main.o main.cpp
 
####### Install
 
install:   FORCE
 
uninstall:   FORCE
 
FORCE:
 


Название: Re: В разных IDE разные файлы проектов...
Отправлено: niXman от Январь 05, 2010, 21:29
на протяжении всей темы не могу понять о чем Денди хочет сказать ???


Название: Re: В разных IDE разные файлы проектов...
Отправлено: SABROG от Январь 05, 2010, 21:37
а вот мой. в конце смотрим внимательно. вопросы?

Попробовал добавить не существующий файл foobar.h в HEADERS += broken.h foobar.h. qmake руганулся, что не может найти файл, но сгенерил makefile где только main.cpp (я закомментировал include в main.cpp).

Плавающий баг, который зависит от ОС?


Название: Re: В разных IDE разные файлы проектов...
Отправлено: niXman от Январь 05, 2010, 21:44
Цитировать
Плавающий баг, который зависит от ОС?
возможно. давно венды не видел.
есть еще отличие mingw32-make от make из MSYS пакета. попробуйте, чтоб выяснить раз и на всегда!


Название: Re: В разных IDE разные файлы проектов...
Отправлено: niXman от Январь 05, 2010, 21:47
вот кусок makefile из настоящего проекта. и так же все пучком.
Код
INI
tmp/release/main.o: main.cpp config.hpp \
dirdiff.hpp \
fileinfo.hpp \
scandir.hpp \
rpcmethods.hpp \
xmlrpc/XmlRpc.h \
xmlrpc/XmlRpcClient.h \
xmlrpc/XmlRpcDispatch.h \
xmlrpc/XmlRpcSource.h \
xmlrpc/XmlRpcException.h \
xmlrpc/XmlRpcServer.h \
xmlrpc/XmlRpcServerMethod.h \
xmlrpc/XmlRpcValue.h \
xmlrpc/XmlRpcUtil.h \
tools.hpp \
torrentcontext.hpp \
log.hpp \
sleep.hpp \
console.hpp
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o tmp/release/main.o main.cpp
 
tmp/release/fileinfo.o: fileinfo.cpp fileinfo.hpp
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o tmp/release/fileinfo.o fileinfo.cpp
 
tmp/release/dirdiff.o: dirdiff.cpp dirdiff.hpp \
fileinfo.hpp
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o tmp/release/dirdiff.o dirdiff.cpp
 


Название: Re: В разных IDE разные файлы проектов...
Отправлено: SABROG от Январь 05, 2010, 21:51
Попробовал под MSYS, makefile получился на 200 байт длиннее, но внешних признаков отличия я не заметил, также как и присутствия broken.h

Если этот файл насильно запихнуть в SOURCES, то получается такой makefile:

Код:
release/main.o: main.cpp 
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o release\main.o main.cpp

release/broken.o: broken.h
$(CC) -c $(CFLAGS) $(INCPATH) -o release\broken.o broken.h

И комплиятор не собирает проект:

Код:
release/broken.o: file not recognized: File format not recognized


Название: Re: В разных IDE разные файлы проектов...
Отправлено: niXman от Январь 05, 2010, 21:56
так это что получается? что прогеры под вендавз самые несчастные прогеры в мире?
а как тогда зависимости отслеживаются?
маловероятно чтоб такое не было замечено троллями. хотя...


Название: Re: В разных IDE разные файлы проектов...
Отправлено: niXman от Январь 05, 2010, 21:59
Цитировать
release/broken.o: broken.h
   $(CC) -c $(CFLAGS) $(INCPATH) -o release\broken.o broken.h
;D


Название: Re: В разных IDE разные файлы проектов...
Отправлено: SABROG от Январь 05, 2010, 22:00
так это что получается? что прогеры под вендавз самые несчастные прогеры в мире?
а как тогда зависимости отслеживаются?
маловероятно чтоб такое не было замечено троллями. хотя...

Тут получается, что при каждом изменении/добавлении/удалении директивы #include надо пересобирать .pro файл, т.е. qmake делать, тогда изменения в зависимых .h файлах отслеживаются, т.к. запись меняется в makefile.


Название: Re: В разных IDE разные файлы проектов...
Отправлено: Dendy от Январь 05, 2010, 22:02
HEADERS вообще ни на что не влияет, qmake берёт из них список файлов для генерации мета-информации, к разрешению зависимостей эта переменная не имеет отношения.

niXman, я не понимаю как вы проверяете. Дописываете #include "...", потом прогоняете qmake и смотрите на результат? Если так, то я два раза написал, что проблема не в этом, а в том, что зависимость не появляется в Makefile после того как вы прогнали qmake, а уж затем добавили #include "..." и запустили make.

При чём здесь операционная система я не понимаю, проблема то не в том как работает qmake, а в том, что в результирующем Makefile отсутствует команда для регенерации зависимостей между исходниками. Сейчас запущу на Линуксе, проверю.


Название: Re: В разных IDE разные файлы проектов...
Отправлено: SABROG от Январь 05, 2010, 22:05
HEADERS вообще ни на что не влияет, qmake берёт из них список файлов для генерации мета-информации, к разрешению зависимостей эта переменная не имеет отношения.

Т.е. это чисто MOC'овская переменная для хедеров с классами на базе QObject'a?


Название: Re: В разных IDE разные файлы проектов...
Отправлено: niXman от Январь 05, 2010, 22:06
я просто изменяю один из файлов проекта, и и выполняю make. и все что по зависимостям, пересобирается. что не так?


Название: Re: В разных IDE разные файлы проектов...
Отправлено: niXman от Январь 05, 2010, 22:08
аааа! вот ты о чем!(вот я дубень) )
щас.


Название: Re: В разных IDE разные файлы проектов...
Отправлено: SABROG от Январь 05, 2010, 22:12
Получается отличае CMake от QMake в этом плане такое, что первый проходится по всем исходниками в момент сборки и определяет зависимости, в то время как QMake делает это всего-лишь один раз при генерации makefile'ов.

В некотором смысле это не проблема, т.к. конечный потребитель, который будет собирать программу из исходников, будет вынужден запустить qmake на .pro файл, т.к. ему нужны мейкфайлы уже для его ОС. Просто qmake тут заставляет ломать голову уже разработчику.


Название: Re: В разных IDE разные файлы проектов...
Отправлено: niXman от Январь 05, 2010, 22:15
да, все верно. после добавления хидера к одному из исходников, он появляется в его зависимостях только после генерации makefile


Название: Re: В разных IDE разные файлы проектов...
Отправлено: Dendy от Январь 05, 2010, 22:28
Только что проверил на Линуксе. Чуда не произошло.

SABROG, вы правы. В итоге гарантировано без ошибок QMake'ом можно собрать проект только с нуля. Хотя здесь для конечного пользователя припасены другие грабли вроде невозможности узнать какие переменные можно подтюнить на этапе конфигурации, банально указать префикс инсталяции, а также отсутствие какого-либо механизма проверки системы на наличие пререквизитов. В итоге после генерации Makefile'а и запуска make последний ругнётся на отсутствие заголовочника "абвгд.h" и поди узнай что за dev-пакет ты забыл установить.

Собственно вопрос стоял какой из генераторов Makefile'ов можно использовать для кодинга. QMake здесь однозначно сливает.


Название: Re: В разных IDE разные файлы проектов...
Отправлено: Авварон от Январь 05, 2010, 22:35
странная логика... по-моему я на прошлой странице привел выдержку grep'а мейкфайла говорящую о том, что qmake лазит по исходникам и выцепляет только нужные хедеры. По-моему это логично, и трудно называть это багом. Тем более что по вашим словам смейк выполняет ту же работу, но каждый раз и все нарекания на кумейк в скорости


Название: Re: В разных IDE разные файлы проектов...
Отправлено: SABROG от Январь 05, 2010, 22:37
банально указать префикс инсталяции
Если .pro файл поддерживает такую возможность, то повлиять на переменные можно через окружение или передав нужный параметр в qmake.

, а также отсутствие какого-либо механизма проверки системы на наличие пререквизитов.
А каким образом они проверяются? Если путем поиска нужных файлов по нужным директориям, то это осуществимо.

привел выдержку grep'а мейкфайла
В моих makefile'ах никаких grep'ов нет.


Название: Re: В разных IDE разные файлы проектов...
Отправлено: Авварон от Январь 05, 2010, 22:47
grep - никсовая команда, ищущая строку в файле... в 1м мейкфайле нет строк, содержащих broken.h (та где нет инклюда в мейне), во 2м есть. как следствие, qmake смотрит исходники


Название: Re: В разных IDE разные файлы проектов...
Отправлено: SABROG от Январь 05, 2010, 23:10
grep - никсовая команда, ищущая строку в файле... в 1м мейкфайле нет строк, содержащих broken.h (та где нет инклюда в мейне), во 2м есть. как следствие, qmake смотрит исходники

Это я знаю. Я подумал, что у тебя qmake генерит такой makefile, который grep'ом каждый раз выцепляет зависимости из исходников при вызове make. В общем какое твое мнение, баг или фича?


Название: Re: В разных IDE разные файлы проектов...
Отправлено: Dendy от Январь 05, 2010, 23:18
по-моему я на прошлой странице привел выдержку grep'а мейкфайла говорящую о том, что qmake лазит по исходникам и выцепляет только нужные хедеры.

Это делается только если явно выполнить qmake перед make. Речь же шла об автоматизации этого процесса.

Тем более что по вашим словам смейк выполняет ту же работу, но каждый раз и все нарекания на кумейк в скорости

CMake делает это автоматически и быстро, поскольку не перегенерирует сам Makefile, а список зависимостей хранит в отдельных файлах: depend.internal и depend.make и перегенерирует их с помощью скрипта DependInfo.cmake, а не парсит файл проекта вновь и вновь.

Кроме того документация по make советует делать отдельный файл со списком зависимостей для каждого исходника/заголовочника, чтобы максимально ускорить перегенерацию. Нужно посмотреть, есть ли какая переменная в CMake для этого. В любом случае - разработчики могут добавить эту возможность в CMake в любой момент, чего не скажешь про QMake.

И это только список зависимостей. Я уже не говорю про то, что в QMake напрочь отсутствует механизм проверки формата команды для генерации целей. И здесь вам уже никакой дополнительный вызов qmake перед make не поможет - только полная пересборка проекта, даже если вы изменили формат команды для одного файла из сотни.

Пример:

1. Два файла:

main.cpp
Код
C++ (Qt)
#include <stdio.h>
 
int main( int argc, char ** argv )
{
#ifdef BROKEN_YO
   printf( "Yo enabled\n" );
#else
   printf( "Yo disabled\n" );
#endif
   return 0;
}

broken.pro
Код
C++ (Qt)
CONFIG += console
SOURCES += main.cpp

$ qmake
$ make
$ broken
> Yo disabled

2. Добавляем макрос в pro-файл:

broken.pro
Код
C++ (Qt)
CONFIG += console
DEFINES += BROKEN_YO
SOURCES += main.cpp

$ qmake
$ make
$ broken
> Yo disabled

Смотрим содержимое Makefile - макрос дейстивтельно добавлен. Пересборка не произошла.

В CMake же хранится хеш со списком форматов команд для каждой цели в файле CMakeRuleHashes.txt, который автоматически пересоберёт именно тот файл, для которого вы добавили DEFINE. Всё это делается автоматом одним вызовом make. В QMake же эту головную боль лечат отрубанием головы:

$ make clean
$ make
$ broken
> Yo enabled


Название: Re: В разных IDE разные файлы проектов...
Отправлено: Авварон от Январь 05, 2010, 23:34
2 SABROG моё мнение - фича.
Другое дело, что кумейку не хватает функциональности и скорости.


Название: Re: В разных IDE разные файлы проектов...
Отправлено: SABROG от Январь 05, 2010, 23:41
2 SABROG моё мнение - фича.
Другое дело, что кумейку не хватает функциональности и скорости.

Интересно, что придумают тролли http://labs.trolltech.com/blogs/2009/10/14/to-make-or-not-to-make-qmake-and-beyond-redux/


Название: Re: В разных IDE разные файлы проектов...
Отправлено: Dendy от Январь 05, 2010, 23:44
Очевидно что Тролли знают про проблемы QMake'а. Другое дело что технически решить их практически нереально - нужно ломать архитектуру всей системы сборки. Поэтому называть багами не стали - ведь баги пришлось бы фиксить. Куда проще называть это фичей и переложить все проблемы на головы пользователей.


Название: Re: В разных IDE разные файлы проектов...
Отправлено: lit-uriy от Январь 06, 2010, 00:11
я кажется понял почему у части людей не возникает проблем, например, у меня.

создав новый файл и приинклюдив его я добавляю этот файл в pro-файл. По команде make, запускается qmake, т.к. pro-файл изменился. Ну а раз qmake запустился, то всё что нужно подхватилось.


Название: Re: В разных IDE разные файлы проектов...
Отправлено: lit-uriy от Январь 06, 2010, 00:15
Dendy, насчёт внесения дефайнов в pro-файл ты прав. Я, чтобы сократить время пересборки, убиваю объектник который требуется пересоздать.


Название: Re: В разных IDE разные файлы проектов...
Отправлено: Dendy от Январь 06, 2010, 00:19
создав новый файл и приинклюдив его я добавляю этот файл в pro-файл. По команде make, запускается qmake, т.к. pro-файл изменился. Ну а раз qmake запустился, то всё что нужно подхватилось.

Этот фокус работает ровно один раз. Проинклудив заголовочник позже в другом cpp-файле зависимость этого cpp-файла от заголовочника не создастся. Со всеми вытекающими.


Название: Re: В разных IDE разные файлы проектов...
Отправлено: lit-uriy от Январь 06, 2010, 00:24
да, факт.


Название: Re: В разных IDE разные файлы проектов...
Отправлено: break от Январь 06, 2010, 01:26
Выходит qmake значительно слабее cmake, однако
Цитировать
Собственно вопрос стоял какой из генераторов Makefile'ов можно использовать для кодинга. QMake здесь однозначно сливает.
считаю это заявление преувеличением - мы используем у себя пока именно qmake и работать с ним вполне возможно. Хотя периодически возникают глюки которые решаются только перекомпиляцией всего проекта.


Название: Re: В разных IDE разные файлы проектов...
Отправлено: Dendy от Январь 06, 2010, 02:08
Ну, можно и в ежовых рукавицах кодить. Вопрос в целесообразности. Назовите мне хоть хоть одно преимущество QMake перед CMake при инкрементальной сборке проекта.


Название: Re: В разных IDE разные файлы проектов...
Отправлено: lit-uriy от Январь 06, 2010, 02:29
>>при инкрементальной сборке проекта.
А ты по рабоче-крестьянски объясни, что это такое


Название: Re: В разных IDE разные файлы проектов...
Отправлено: Dendy от Январь 06, 2010, 02:55
Грубо говоря, это когда сборка не с чистого листа, а после небольших изменений, когда нужно пересобрать необходимый минимум и гарантировать целостность результата.

P.S. Поискал в гугле "инкрементальная сборка", девятая ссылка - на мой пост в этом треде (-:


Название: Re: В разных IDE разные файлы проектов...
Отправлено: break от Январь 06, 2010, 03:15
Цитировать
Ну, можно и в ежовых рукавицах кодить. Вопрос в целесообразности. Назовите мне хоть хоть одно преимущество QMake перед CMake при инкрементальной сборке проекта.
Возможно преимуществ нет. Это просто наиболее простой не требующий затрат способ - т.к. сама Qt использует qmake - то логично что большинство проектов на Qt тоже используют qmake - возможно переход на cmake - это правильный шаг в развитие проекта.


Название: Re: В разных IDE разные файлы проектов...
Отправлено: Dendy от Январь 06, 2010, 03:32
Приношу извинения break'у, которого ни за что зацепил гнилой овощ, летящий в сторону lit-uriy выше по треду (-: http://www.prog.org.ru/index.php?topic=11935.msg74788#msg74788


Название: Re: В разных IDE разные файлы проектов...
Отправлено: lit-uriy от Январь 06, 2010, 06:21
>>Приношу извинения break'у, которого...
А это потому-что щёлкнув по нику пользователя улетаешь в его профиль, вместо вставки его ника в форму быстрого ответа, поэтому приходится копи-пастить со всеми вытекающими.

П.С. Оффтоп, конечно, но напрягает. Может, можно форум подкрутить?


Название: Re: В разных IDE разные файлы проектов...
Отправлено: Dendy от Январь 06, 2010, 06:47
Скорее всего это я просто перегрелся (-; Подкрутить форум - в соответствующую ветку.


Название: Re: В разных IDE разные файлы проектов...
Отправлено: niXman от Январь 06, 2010, 13:32
Цитировать
Подкрутить форум - в соответствующую ветку.
в той ветке, уже лежит тема про смайлы. и, как не печально, нет ни одного ответа модераторов или администрации ;)


Название: Re: В разных IDE разные файлы проектов...
Отправлено: break от Январь 07, 2010, 16:31
Реально сейчас перейти на cmake - и продожать работать с QTCreator? Тролли вроде какую-то поддержку cmake делали - кто-нибудь пробовал? (Dendy убедил меня что cmake лучше - надоело пересобирать проект при каждом подозрительном глюке...)


Название: Re: В разных IDE разные файлы проектов...
Отправлено: BRE от Январь 07, 2010, 17:05
Реально сейчас перейти на cmake - и продожать работать с QTCreator? Тролли вроде какую-то поддержку cmake делали - кто-нибудь пробовал?
Перейти на CMake можно в любой момент и времени на это уйдет не много, даже можно поддерживать несколько систем сборки (CMake, qmake и autotools в придачу :)).
А вот на каком уровне сделана поддержка CMake в QtCreator не скажу, последним не пользуюсь.



Название: Re: В разных IDE разные файлы проектов...
Отправлено: break от Январь 07, 2010, 17:49
Сории я тоже что-то аггрессивен стал... ::)

Блин проект большой - файлов много и работы много кроме перехода на дргугую систему сборки - хочется получить инфу от спецов может кто пробовал - от креатора пока не откажусь - он меня устраивает и даже кажется оч. удобным (но это естественно ИМХО)... Попрубую естественно когда время выйдет, я просто не знал о косяках QMake в плане зависимостей - Dendy открыл глаза - а то мы с ребятами - "что не работает -а ну пересобирать весь проект пробывал" - это блин уже дилетантство какое-то... хочется быть на уровне!


Название: Re: В разных IDE разные файлы проектов...
Отправлено: Пантер от Январь 07, 2010, 19:13
Я перешел на CMake. Креатор более-менее нормально с ним работает. Только при добавлении файлов, придется самому их в CMakeLists вписывать, креатор этого не делает.
break: за ругань предупреждение. Подправь свой пост. А можешь даже удалить его, так как ничего полезного он  не несет. В следующий раз ругайся в личку.


Название: Re: В разных IDE разные файлы проектов...
Отправлено: break от Январь 07, 2010, 19:56
Цитировать
Только при добавлении файлов, придется самому их в CMakeLists вписывать
это мелочи - ничего страшного..
пост удалил


Название: Re: В разных IDE разные файлы проектов...
Отправлено: Dendy от Январь 07, 2010, 23:01
Поскольку CMake - язык программирования, то и писать его прийдётся руками. В этом его большой плюс. Я с трудом представляю как IDE может генерировать CMakeLists.txt, точно так же, как и исходник в C++.

Пантер, как при работе с Makefile-проектом добавить в Creator файлы? Попытка добавить через контекстное меню создаёт длинное дерево пути к исходнику вида "../../../../../../projects/some_directory/other_directory/yet_more_durectory/mysource.cpp". Естественно чтобы в TreeView добраться до mysource.cpp нужно раскрыть дерево директорий (на 90% пустое) на пол экрана.


Название: Re: В разных IDE разные файлы проектов...
Отправлено: Пантер от Январь 07, 2010, 23:44
Dendy: что-то не понял о чем ты...


Название: Re: В разных IDE разные файлы проектов...
Отправлено: Dendy от Январь 08, 2010, 00:36
Есть Makefile-проект в Creator'е. Как добавить в него файлы, чтобы они отображались в панели проекта?


Название: Re: В разных IDE разные файлы проектов...
Отправлено: break от Август 01, 2010, 00:49
У себя перешли на cmake - хуже не стало - пересборка проекта теперь практически не требуется, в QtCreator все работает как раньше а добавление файлов в cmakelists.txt вручную - не большая плата за более грамотную систему сборки.

Так что кто сомневается - вперед...