Задание зависимостей между проектами SUBDIRS с помощью .depends не работает - PullRequest
0 голосов
/ 26 апреля 2019

У меня проблемы с установкой зависимостей между подпроектами в контексте проекта qmake SUBDIRS.

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

Не понимаю ли я значение параметра .depends?

Вот минимальный пример, иллюстрирующий проблему:

+mysubdirs/
| mysubdirs.pro
| +mylib/
| | mylib.pro
| | MyClass.h
| | MyClass.cpp
| +myapp/
| | myapp.pro
| | main.cpp

mysubdirs.pro :

TEMPLATE = subdirs
SUBDIRS += mylib
SUBDIRS += myapp
CONFIG += ordered
myapp.depends = mylib

mylib.pro:

TEMPLATE = lib
CONFIG += staticlib
HEADERS = MyClass.h
SOURCES = MyClass.cpp

myapp.pro :

TEMPLATE = app
SOURCES = main.cpp
LIBS += "../../build-mysubdirs/mylib/libmylib.a"
INCLUDEPATH += ../mylib

MyClass.h :

#ifndef MYCLASS_H
#define MYCLASS_H
class MyClass
{
public:
    MyClass();
};
#endif // MYCLASS_H

MyClass.cpp :

#include "MyClass.h"
#include <iostream>
MyClass::MyClass()
{
    std::cout << "in constructor" << std::endl;
}

main.cpp :

#include "MyClass.h"
int main()
{
    MyClass x;
    return 0;
}

Скомпилируйте проект subdirs.Затем измените строку «in constructor» на что-то другое и перекомпилируйте: вывод myapp не изменится.

1 Ответ

1 голос
/ 26 апреля 2019

Не понимаю ли я значение параметра .depends?

Да, вы.

По сути, qmake является генератором "Makefile".И «.depends» здесь означает «зависимость в сгенерированном Makefile».Таким образом, myapp.depends = mylib становится myapp: mylib в корневом Makefile.

Однако, mylib и myapp (будучи SUBDIRS) являются просто .PHONY целями, которые выполняют рекурсивные вызовы make.Таким образом, в конце дня make запустит две подмодели, которые абсолютно не зависят друг от друга (как это обычно бывает с рекурсивным шаблоном make), за исключением того, что одна подмодель всегда запускается раньше другой (из-заотношение цель-пререквизит в корневом Makefile).

Кстати, это означает, что CONFIG += ordered здесь не имеет смысла и должно быть опущено (на самом деле, оно устарело в пользу .depends).

Теперь, учитывая перекомпиляцию myapp: получается, что ваш исполняемый файл НЕ зависит от вашей библиотеки (в «простом смысле»), за исключением того, что библиотека упоминается в $$LIBS(т.е. флаги компоновщика).Чтобы решить эту проблему, вы должны вручную добавить свою библиотеку в список зависимостей назначения приложения:

myapp.pro

PRE_TARGETDEPS += path/to/mylib.a
...