使用.depends指定SUBDIRS项目之间的依赖关系不起作用

问题描述 投票:0回答:1

我在qmake SUBDIRS项目的上下文中设置子项目之间的依赖关系时遇到问题。

我正在使用.depends选项来建立一个项目对另一个项目的依赖关系,期望在修改后者时重新编译前者,但这不会发生 - 后者在修改后重新编译,但依赖项目不是。

我误解了.depends选项的含义吗?

这是一个说明问题的最小例子:

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

没有宿便地认识.pro:

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

没有离别.pro:

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

没有app.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;
}

编译子目录项目。然后将字符串“in constructor”更改为其他内容并重新编译:myapp的输出不变。

c++ qt qmake
1个回答
1
投票

我误解了.depends选项的含义吗?

是的,你是。

基本上,qmake是一个“Makefile” - 生成器。而“.depends”在这里意味着“生成的Makefile中的依赖”。所以myapp.depends = mylib在根Makefile中成为myapp: mylib

然而,mylibmyappSUBDIRS)都只是执行递归调用的.PHONY目标。因此,在一天结束时,make将运行两个子make,它们绝对不依赖于彼此(通常使用递归make模式),除了一个sub-make总是在另一个之前运行(因为一个根Makefile中的目标先决条件关系)。

顺便说一句,这意味着CONFIG += ordered在这里没有任何意义,应该省略(实际上,它被弃用而不是.depends)。

现在,考虑重新编译myapp:事实证明你的可执行文件不依赖于你的库(在“make-sense”中),除了在$$LIBS中提到了库(即链接器标志)。要解决此问题,您必须手动将库添加到应用程序目标依赖关系列表:

没有app.pro

PRE_TARGETDEPS += path/to/mylib.a
© www.soinside.com 2019 - 2024. All rights reserved.