使用 .depends 指定 SUBDIRS 项目之间的依赖关系不起作用
Specifying dependencies between SUBDIRS projects with .depends doesn't work
我在 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;
}
编译子目录项目。然后把字符串"in constructor"改成别的,重新编译:myapp的输出不变。
Am I misunderstanding the meaning of the .depends option?
是的,你是。
基本上,qmake
是一个 "Makefile" 生成器。而“.depends”在这里的意思是"a dependency in a generated Makefile"。所以 myapp.depends = mylib
在根 Makefile 中变为 myapp: mylib
。
然而,mylib
和 myapp
(即 SUBDIRS
)都只是 .PHONY
执行递归 make 调用的目标。因此,在一天结束时,make 将 运行 两个子 make,它们绝对不相互依赖(因为递归 make 模式通常如此),除了一个子 make 总是 运行s 在另一个之前(因为根 Makefile 中的目标先决条件关系)。
顺便说一句,这意味着 CONFIG += ordered
在这里没有意义,应该被省略(事实上,它已被弃用,取而代之的是 .depends
)。
现在,考虑重新编译 myapp
:事实证明,您的可执行文件 不 依赖于您的库(在 "make-sense" 中),除了$$LIBS
中提到了库(即链接器标志)。要解决此问题,您必须手动将库添加到应用程序目标依赖项列表:
myapp.pro
PRE_TARGETDEPS += path/to/mylib.a
我在 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;
}
编译子目录项目。然后把字符串"in constructor"改成别的,重新编译:myapp的输出不变。
Am I misunderstanding the meaning of the .depends option?
是的,你是。
基本上,qmake
是一个 "Makefile" 生成器。而“.depends”在这里的意思是"a dependency in a generated Makefile"。所以 myapp.depends = mylib
在根 Makefile 中变为 myapp: mylib
。
然而,mylib
和 myapp
(即 SUBDIRS
)都只是 .PHONY
执行递归 make 调用的目标。因此,在一天结束时,make 将 运行 两个子 make,它们绝对不相互依赖(因为递归 make 模式通常如此),除了一个子 make 总是 运行s 在另一个之前(因为根 Makefile 中的目标先决条件关系)。
顺便说一句,这意味着 CONFIG += ordered
在这里没有意义,应该被省略(事实上,它已被弃用,取而代之的是 .depends
)。
现在,考虑重新编译 myapp
:事实证明,您的可执行文件 不 依赖于您的库(在 "make-sense" 中),除了$$LIBS
中提到了库(即链接器标志)。要解决此问题,您必须手动将库添加到应用程序目标依赖项列表:
myapp.pro
PRE_TARGETDEPS += path/to/mylib.a