Opened 8 years ago

Closed 8 years ago

Last modified 8 years ago

#156 closed баг (fixed)

Убрать пути к хедерам Qt в #include'ах

Reported by: alx Owned by: dimag
Priority: major Milestone: 1 очередь
Component: ПО MC04-Dispatcher. Пульт диспетчера/техника Keywords: include, headers
Cc: san

Description

Сейчас в исходных файлах заголовочные файлы Qt подключаются с указанием пути:

#include <QtWidgets/QApplication>
#include <QtWidgets/QLabel>

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

#include <QApplication>
#include <QLabel>

Change History (31)

comment:1 by dimag, 8 years ago

Для компилятора Visual Studio пути нужно полностью указывать, иначе заголовочный файл не будет найден, используя рекомендованный путь к заголовочным файлам для Visual Studio 2013 - "C:\Qt\5.6\msvc2013\include". Я пробовал заменить путь в include с #include <QtWidgets/QApplication>
на #include <QApplication>
и получил фатальную ошибку компиляции - заголовочный файл не найден.
Использовать Qt на Visual Studio аналогично использованию MFC на Borland C++ Builder, есть нюансы, которые нужно учитывать чтобы программа скомпилировалась на Borland C++ Builder и Visual Studio без переделки.

comment:2 by dimag, 8 years ago

Resolution: wontfix
Status: newclosed

in reply to:  2 ; comment:3 by alx, 8 years ago

Replying to dimag:

Для компилятора Visual Studio пути нужно полностью указывать, иначе заголовочный файл не будет найден, используя рекомендованный путь к заголовочным файлам для Visual Studio 2013 - "C:\Qt\5.6\msvc2013\include".

  1. Кем рекомендованные?
  2. Так используйте не рекомендованные пути - например "C:\Qt\5.6\msvc2013\include\QWidgets" и т.п..

Результатом вашей работы является исходный текст программы. Следовательно, именно исходный код должен быть написан правильно и максимально переносимо. Чем лично Вы компилируете его на вашем компьютере в процессе работы - Ваше личное дело. Документация Qt говорит, что заголовочные файлы должны подключаться так:

#include <QApplication>
#include <QString>

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

Использовать Qt на Visual Studio аналогично использованию MFC на Borland C++ Builder, есть нюансы, которые нужно учитывать чтобы программа скомпилировалась на Borland C++ Builder и Visual Studio без переделки.

??? Не понял, к чему это сказано. Нужно учитывать - учитывайте. Я не возражаю. :)

in reply to:  1 comment:4 by alx, 8 years ago

Replying to dimag:

Я пробовал заменить путь в include с #include <QtWidgets/QApplication>
на #include <QApplication>
и получил фатальную ошибку компиляции - заголовочный файл не найден.

В комплекте Qt есть примеры (например, один из самых простых - simple). Примеры, идущие в комплекте Qt, у Вас собираются? Если нет, значит у Вас неправильно настроена среда компиляции, и решать эту проблему надо у Вас на компьютере, а не в исходном коде. А если компилируется, то я не понимаю, почему у Вас конструкция #include <QApplication> из примера simple компилируется без проблем, а точно такая же конструкция в программе MC04Dispatcher дает фатальную ошибку...

comment:5 by alx, 8 years ago

Resolution: wontfix
Status: closedreopened

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

comment:6 by dimag, 8 years ago

Keywords: include headers added
Resolution: fixed
Status: reopenedclosed

Я думаю Qt поддерживает одновременно два пути для #include файлов. r251
Я попробовал в программе Qt-Creator под Linux добавлять QApplication в программу через
#include <QApplication> и через #include <QtWidgets/QApplication>, все заработало в обеих случаях. Я считаю что Qt поддерживает обе формы задания пути для включаемого файла. Поэтому мой код верен в этих местах.

comment:7 by alx, 8 years ago

Resolution: fixed
Status: closedreopened

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

comment:8 by dimag, 8 years ago

Resolution: invalid
Status: reopenedclosed

Я использовал настройки путей рекомендованные для Visual Studio, для них корректный путь к загловочным файлам - полный путь.

in reply to:  8 comment:9 by san, 8 years ago

Resolution: invalid
Status: closedreopened

Replying to dimag:

Я использовал настройки путей рекомендованные для Visual Studio, для них корректный путь к загловочным файлам - полный путь.

Рекомендованые кем?

comment:10 by dimag, 8 years ago

Прочитал в интерненте статью по настройки по следующему адресу:
http://www.gamedev.ru/articles/qt4_visual_studio_2010

comment:11 by dimag, 8 years ago

Resolution: fixed
Status: reopenedclosed

in reply to:  3 comment:12 by san, 8 years ago

Resolution: fixed
Status: closedreopened

Дима, что ты так торопишься закрыть тикет?
Процитирую комент Алексея:
Replying to alx:

Результатом вашей работы является исходный текст программы. Следовательно, именно исходный код должен быть написан правильно и максимально переносимо. Чем лично Вы компилируете его на вашем компьютере в процессе работы - Ваше личное дело. И если для сборки требуется нарушить какую-то рекомендацию - либо пути в исходном коде, либо пути в настройках компилятора, я считаю, выбор должен быть сделан в пользу изменения путей в компиляторе, но оставления стандартных путей в исходном коде. Потому что применение нестандартных путей в исходном коде ради одного конкретного компилятора ломает сборку остальными компиляторами и нарушает совместимость между версиями библиотеки.

Я с ним согласен.

in reply to:  10 comment:13 by alx, 8 years ago

Replying to dimag:

Прочитал в интерненте статью по настройки по следующему адресу:
http://www.gamedev.ru/articles/qt4_visual_studio_2010

При всем уважении к автору этой статьи, если рекомендация некоего VDragon противоречит указаниями официальной документации создателей Qt (The Qt Company), тут по-моему и вопроса возникнуть не может, чьему указанию следовать...

К тому же в статье не приводится никаких аргументов, почему автор в настройках vc прописывает именно такой путь для инклудов (C:\Qt\4.7.1\include), а не пути, рекомендуемые авторами библиотеки...

Last edited 8 years ago by alx (previous) (diff)

comment:14 by dimag, 8 years ago

Вы предлагаете везде записывать заголовочные файлы в формате:
#include <QtWidgets/QMessagebox>
вместо
#include <QtWidgets/qmessagebox.h>?
Я могу так сделать.

comment:15 by alx, 8 years ago

Я предлагаю записывать заголовочные файлы в формате:

#include <QMessageBox>

вместо

#include <QtWidgets/qmessagebox.h>

То есть так, как предписывает документация на класс QMessageBox.

comment:16 by dimag, 8 years ago

Я предпочёл бы записавать заголовочные файлы в виде #include <QtWidgets / QMessagebox>.

Если вы не против, то я переделаю.

В таком виде тоже можно.

comment:17 by dimag, 8 years ago

Resolution: fixed
Status: reopenedclosed

in reply to:  16 comment:18 by alx, 8 years ago

Resolution: fixed
Status: closedreopened

Replying to dimag:

Я предпочёл бы записавать заголовочные файлы в виде #include <QtWidgets / QMessagebox>.

Если вы не против, то я переделаю.

Если бы я не был против, я не создал ты этот тикет.

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

comment:19 by san, 8 years ago

Дима, в чём проблема?
Задание тикета выглядит "формальным исправлением", однако ему уже 3 месяца.

comment:20 by san, 8 years ago

Milestone: Текущее1 очередь

comment:21 by dimag, 8 years ago

Resolution: fixed
Status: reopenedclosed

В Microsoft Visual Studio пути к заголовочным файлам должны задаваться в виде
<QtWidgets/QApplication>, задавать путь к заголовочным файлам в виде <QApplication> нельзя, произойдет ошибка компиляции "файл не найден". Среда MSVS2013 отличается от QtCreator, который автоматический настраивает пути в QTDIR.
Я установил рекомендованный путь к заголовочным файлам.
Для данной среды необходимо дополнительно настривать переменные среды в PATH и т.д., что я не хочу делать или установить специальный Wizard от Qt.
Кроме того путь в виде <QtWidgets/QApplication> - полный путь, тоже допустим и я его использую.
Я считаю чтоя закрыл этот тикет в r353.

comment:22 by san, 8 years ago

Resolution: fixed
Status: closedreopened

Переоткрываю, тикет был закрыт как fixed, однако проблема не устранена

in reply to:  21 comment:23 by san, 8 years ago

Replying to dimag:

В Microsoft Visual Studio пути к заголовочным файлам должны задаваться в виде
<QtWidgets/QApplication>,

Дай пожалуйста ссылку на документацию, где об этом сказано.

Я установил рекомендованный путь к заголовочным файлам.

Кем рекомендованный?

Для данной среды необходимо дополнительно настривать переменные среды в PATH и т.д., что я не хочу делать или установить специальный Wizard от Qt.


Процитирую Алексея ещё раз:

Результатом вашей работы является исходный текст программы. Следовательно, именно исходный код должен быть написан правильно и максимально переносимо. Чем лично Вы компилируете его на вашем компьютере в процессе работы - Ваше личное дело. И если для сборки требуется нарушить какую-то рекомендацию - либо пути в исходном коде, либо пути в настройках компилятора, я считаю, выбор должен быть сделан в пользу изменения путей в компиляторе, но оставления стандартных путей в исходном коде. Потому что применение нестандартных путей в исходном коде ради одного конкретного компилятора ломает сборку остальными компиляторами и нарушает совместимость между версиями библиотеки.



я не хочу делать

Я не считаю это достаточным аргументом для закрытия тикета

comment:24 by alx, 8 years ago

comment:18:

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

Ходим по кругу.

comment:21:

В Microsoft Visual Studio пути к заголовочным файлам должны задаваться в виде <QtWidgets/QApplication>,

Вы можете аргументировать данное утверждение чем-то еще кроме слов некоего VDaemon'a (который, в свою очередь, тоже ничем это отверждение не аргументировал)?

задавать путь к заголовочным файлам в виде <QApplication> нельзя, произойдет ошибка компиляции "файл не найден".

Если Вы включите в список каталогов, в которых препроцессор выполняет поиск подключаемых файлов, каталог QtWidgets, то почему же он не найдет там QApplication?

Кстати, в Qt4 QApplication находится в QtGui, а вовсе не в QtWidgets. Таким образом, пытаясь указывать родительский каталог, Вы еще и ломаете совместимость.

Я установил рекомендованный путь к заголовочным файлам.

Вы установили путь, рекомендованный каким-то VDaemon'ом. Установите вместо этого пути, рекомендуемые разработчиками библиотеки.

Для данной среды необходимо дополнительно настривать переменные среды в PATH и т.д., что я не хочу делать

Извините, конечно, но то, что Вы не хотите что-то делать - это ваши личные проблемы. Если Вы нанялись на выполнение работы, ваши желания не должны влиять на результат.

Кроме того путь в виде <QtWidgets/QApplication> - полный путь, тоже допустим

Можете подтвердить это утверждение ссылкой на документацию? Особенно в свете того, что в Qt4 вообще нет каталога QtWidgets...

Version 0, edited 8 years ago by alx (next)

comment:25 by dimag, 8 years ago

Не могу подтвердить, но у вас всё компилируется, какие ещё нужны подтверждения?

comment:26 by dimag, 8 years ago

Если Вы включите в список каталогов, в которых препроцессор выполняет поиск подключаемых файлов, каталог QtWidgets, то почему же он не найдет там QApplication?
Я не хочу включать список каталог, я этого не должен делать, меня устраивают текущий путь кзагаловочным файлам.

in reply to:  25 ; comment:27 by alx, 8 years ago

Replying to dimag:

Не могу подтвердить, но у вас всё компилируется, какие ещё нужны подтверждения?

У меня все компилируется только после доработки Ваших исходников напильником - а именно удаления всех путей в include'ах.

in reply to:  26 comment:28 by alx, 8 years ago

Replying to dimag:

Я не хочу ...
меня устраивают

OK. Вы не хотите, Вас устраивает. Аргументы понятны. Я заканчиваю дискуссию на эту тему. Продолжайте с вашим руководством.

in reply to:  27 comment:29 by dimag, 8 years ago

Replying to alx:

Replying to dimag:

Не могу подтвердить, но у вас всё компилируется, какие ещё нужны подтверждения?

У меня все компилируется только после доработки Ваших исходников напильником - а именно удаления всех путей в include'ах.

Это доставляем вам сложности? Я могу тогда всё поменять, даже если я считаю это бесполезным мероприятием.

comment:30 by san, 8 years ago

Дима сказал что проблема обозначеная в тикете "была ему не понятна, а сейчас понятна", обещал устранить.

comment:31 by dimag, 8 years ago

Resolution: fixed
Status: reopenedclosed

r400
Сейчас все заголовочные файлы будут такими как хочет Алексей.

Note: See TracTickets for help on using tickets.