Почему qmake помещает все файлы объектов (.o) в один каталог? - PullRequest
24 голосов
/ 26 февраля 2012

Допустим, у меня есть приложение Qt, в котором у меня есть два класса с одинаковыми именами в двух разных пространствах имен:

namespace namespace1
{
    class SomeClass;
}

namespace namespace2
{
    class SomeClass;
}

, и у меня есть структура каталогов проекта в соответствии с этим:

-->src/
  -->namespace1/
    -->someclass.cpp
  -->namespace2/
    -->someclass.cpp

Когда я компилирую приложение с помощью qmake, оно помещает все файлы объектов (.o) в один каталог - поэтому сначала создается файл someclass.o , а затем перезаписывается со вторым someclass.o - это конфликт имен, так что это плохо.

Почему qmake не учитывает структуру каталогов исходных файлов и почему он не создает что-то вроде namespace1_someclass.o и namespace2_someclass.o ?

Да, я могу поместить свои классы в один каталог и присвоить им имена namespace1_someclass.cpp и namespace2_someclass.cpp и не будет никаких конфликтов имен, но это вызывает небольшие неудобства при просмотре исходных файлов в проводнике проекта в Qt Creator, потому что, когда есть много исходных файловТак как в проекте он гораздо менее читабелен, чем если бы существовала структура каталогов , которую я могу развернуть или свернуть.

Еще одна крайность - иметь такую ​​структуру каталогов:

-->src/
  -->namespace1/
    -->namespace1_someclass.cpp
  -->namespace2/
    -->namespace2_someclass.cpp

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

Почему qmake не имеет по крайней мере опцию дляположить объектные файлы в структуру каталогов в соответствии с исходными файлами ?Разве создатели Qt не видят, что это важная особенность?

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

Ответы [ 3 ]

13 голосов
/ 12 ноября 2015

Вы можете поместить объектные файлы рядом с исходными файлами, используя:

CONFIG += object_parallel_to_source

или

CONFIG += object_with_source

в зависимости от вашей версии qmake.

Источник: https://wiki.qt.io/Undocumented_QMake#Config_features

2 голосов
/ 13 августа 2012

В зависимости от того, что вы пытаетесь построить, вы можете использовать для этого шаблон subdirs в qmake. Вам нужно будет поместить файл проекта в каждый из ваших namespace каталогов, и в этом вы можете указать разные выходные каталоги для ваших объектных файлов.

-->src/main.pro
  -->namespace1/n1.pro
    -->someclass.cpp
  -->namespace2/n2.pro
    -->someclass.cpp

main.pro

TEMPLATE = subdirs
SUBDIRS  = namespace1 namespace2

n1.pro и n2.pro:

include("../common.pri")
OBJECTS_DIR = $${PWD}
TARGET = some_target
TEMPLATE = some_qmake_template

common.pri: конфигурации, общие для обоих проектов.

2 голосов
/ 20 мая 2012

Что касается ваших опасений, что CMake может быть слишком сложным: я работал над проектами, использующими обе системы сборки.Хотя я согласен с тем, что qmake, вероятно, легче начать, CMake определенно имеет свои достоинства:

  • Это делает сборку из исходного кода очень простой.Просто выполните cmake <Path to source> в вашей директории сборки.Это замечательно, когда ваши источники находятся на общем ресурсе NFS, например, и вы хотите, чтобы объектные файлы были помещены в локальную файловую систему.

  • Его поддержка для поиска дополнительных библиотек оченьмощный.Многие файлы FindXXX.cmake уже поставляются с вашим дистрибутивом CMake, что делает включение "тяжелых" библиотек, таких как OpenCV, таким же простым, как FIND_PACKAGE(OpenCV REQUIRED).

  • Это дажеимеет встроенную поддержку Qt.Фактически, я использую его для более крупного программного проекта, где Qt используется для части с графическим интерфейсом.Мы выбрали CMake, потому что нам требовалась независимость от платформы и несколько библиотек, которые мы не могли легко добавить с помощью qmake.

В общем, используйте систему сборки you удобно (если ваша система сборки не мешает разработке программного обеспечения).

...