在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的输出未更改。
答案 0 :(得分:1)
我误解了.depends选项的含义吗?
是的,你是
基本上,qmake
是一个“ Makefile”生成器。 “ .depends”在这里表示“生成的Makefile中的依赖项”。因此,myapp.depends = mylib
在根Makefile中成为myapp: mylib
。
不过,mylib
和myapp
(都是SUBDIRS
)都只是执行递归make调用的.PHONY
目标。因此,在一天结束时,make将运行两个子make,这两个子make绝对不相互依赖(这与递归make模式是很常见的),只是一个子make总是在另一个子make之前运行(因为根Makefile中的target-prerequisite关系。
顺便说一句,这意味着CONFIG += ordered
在这里没有意义,应该省略(实际上,它已弃用.depends
)。
现在,考虑重新编译myapp
:事实证明,您的可执行文件不取决于您的库(在“ make-sense”中),除了{ {1}}(即链接器标志)。要解决此问题,您必须将库手动添加到应用程序目标依赖项列表中:
myapp.pro
$$LIBS