У меня есть проект общей библиотеки со структурой, подобной этой:
library.pro:
TEMPLATE = subdirs
CONFIG += ordered
SUBDIRS += libs plugins test_programs
...
QT += concurrent
...
# Those files contains pure interfaces (C++ abstract classes)
# with no implementation, and some helper classes with inline implementation.
# So there is no reason to create yet another subproject for them
HEADERS += iface/IInterface1.h \
iface/IInterface2.h \ # IInterface2 needs QtConcurrent
...
IInterface2.h:
...
#include <QtConcurrent> // ERROR HERE: file not found, i.e. qmake ignores
// "QT += concurrent" statement in library.pro
class MyHelperExc : public QtConcurrent::Exception
{ ... }
class IInterface2: public virtual IBaseInterface
{ ... }
Итак, моя проблема: qmake просто игнорирует переменные операции в SUBDIRS
родительский проект.
Но это нормально работает в подпроектах.
Что я делаю неправильно?
TEMPLATE = subdirs
В этой строке говорится, что library.pro — это просто контейнер для других проектов, содержащийся в подкаталогах, перечисленных в SUBDIRS
переменная. Большинство других переменных в library.pro игнорируются, кроме CONFIG += ordered
, который указывает, что подкаталоги должны обрабатываться в том порядке, в котором они указаны.
Все подпроекты, включающие IInterface2.h, должны иметь QT += concurrent
в своих .pro файлах.
Что я делаю неправильно?
Тот факт, что вы думаете, что qmake будет анализировать, однако это не то, как работает qmake в настоящее время. SUBDIRS будет означать, что он будет выглядеть только в подпапках.