Russian Qt Forum
Ноябрь 22, 2024, 13:50 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3 4 ... 6   Вниз
  Печать  
Автор Тема: В разных IDE разные файлы проектов...  (Прочитано 46514 раз)
Karl-Philipp
Гость
« Ответ #15 : Январь 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.
Записан
Dendy
Гость
« Ответ #16 : Январь 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. Там всё просто. Выше дал ссылки на статьи в Вики.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #17 : Январь 05, 2010, 18:16 »

Dendy, в примере не понял п.2 строчку:
$ broken
что она делает? это имя проекта и как следствие бинаря?

Виндовозе описанное не произойдёт, по крайней мере если broken.h будет указан в переменной HEADERS, в pro-файле Слежение за изменениями ведёт сам make-файл, и вызовет перекомпиляцию main.cpp.
« Последнее редактирование: Январь 05, 2010, 18:19 от lit-uriy » Записан

Юра.
Dendy
Гость
« Ответ #18 : Январь 05, 2010, 18:53 »

broken - имя запускаемого файла (совпадает с именем pro-файла). Весь эксперимент проводился именно в Windows. Добавление HEADERS += broken.h не меняет ровным счётом ничего.

lit-uriy, перед тем как что-то утверждать рекомендую хотя бы проверить самому.
« Последнее редактирование: Январь 06, 2010, 03:27 от Dendy » Записан
igor_bogomolov
Гость
« Ответ #19 : Январь 05, 2010, 19:07 »

Добавление HEADERS += broken.h не меняет ровным счётом ничего.
Попробовал сам. Добавление  HEADERS += broken.h решает описанную выше проблему.
Записан
BRE
Гость
« Ответ #20 : Январь 05, 2010, 19:09 »

Попробовал сам. Добавление  HEADERS += broken.h решает описанную выше проблему.
Значит поправили.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #21 : Январь 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
Записан

Юра.
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #22 : Январь 05, 2010, 19:25 »

broken - имя запускаемого файла (совпадает с именем pro-файла). Весь эксперимент проводился именно в Windows. Добавление HEADERS += broken.h не меняет ровным счётом ничего.

если использовать DEPENDPATH, то изменения файлов отслеживаются. Тот случай что ты описал происходит тогда, когда DEPENDPATH не используется.
« Последнее редактирование: Январь 05, 2010, 19:30 от Alex Custov » Записан
BRE
Гость
« Ответ #23 : Январь 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 и одна из них будет игнорироваться.
Записан
niXman
Гость
« Ответ #24 : Январь 05, 2010, 19:29 »

.pro файлы нужно писать правильно.
Записан
BRE
Гость
« Ответ #25 : Январь 05, 2010, 19:35 »

.pro файлы нужно писать правильно.
Возможно. Я использую qmake только для тестовых примерчиков.
Записан
Dendy
Гость
« Ответ #26 : Январь 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!

Всем задание на дом: а) воспроизвести, б) подумать почему так происходит.
Записан
Dendy
Гость
« Ответ #27 : Январь 05, 2010, 19:46 »

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

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

Сообщений: 3260


Просмотр профиля
« Ответ #28 : Январь 05, 2010, 19:51 »

мне всегда казалось, что для того в мейкфайле и нужны зависимости у цели, чтобы перекомпиливать только то, что надо
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #29 : Январь 05, 2010, 19:56 »

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

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

Собственно, с HEADERS += broken.h всё работает.
Записан
Страниц: 1 [2] 3 4 ... 6   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.255 секунд. Запросов: 23.