我有一个项目,其中ClientLauncher是执行的子目录。我也有两个库GUI和Metrics。
最初,ClientLauncher和GUI是“一个”,并且使用了Metrics库,并且一切都很好。但是,现在在GUI包含度量标准中某些内容的每个地方编译程序时,都会得到"filename.h": No such file or directory
。
之所以要对此进行更改,是因为我希望能够在另一个库UnitTests中测试我的所有代码。因此,我希望将所有内容都存储在库中,以便UnitTests可以使用该代码。
所以GUI现在是一个库,但是它曾经是程序的开始。要将其转换为库,我在[.pro中添加了TEMPLATE = lib
,如下所示。
ClientLauncher“启动” GUI。它只有main.cpp
,并包含“ mainwindow.h”,这是GUI库中的头文件。
ClientLauncher / main.cpp
#include "mainwindow.h"
int main(int argc, char *argv[]) {
return 0; //Actual code doesn't cause error
}
GUI / mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include "metricslib.h" //ERROR: metricslib.h: No such file or directory
#endif
Metrics / metricslib.h
#ifndef METRICSLIB_H
#define METRICSLIB_H
//Nothing that causes error
#endif
我将subdirs项目用作根目录:
TEMPLATE = subdirs
QT += widgets
CONFIG += qt
SUBDIRS += \
ClientLauncher \
Metrics \
GUI
ClientLauncher.depends = GUI
GUI.depends = Metrics
ClientLauncher.pro
QT += core gui charts network sql widgets
CONFIG += c++11 console gui c++14
CONFIG -= app_bundle
SOURCES += \
main.cpp
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
unix|win32: LIBS += -L$$OUT_PWD/../GUI/ -lGUI
INCLUDEPATH += $$PWD/../GUI
DEPENDPATH += $$PWD/../GUI
GUI.pro
QT += core gui charts network sql widgets
TEMPLATE = lib
#DEFINES += GUI_LIBRARY
CONFIG += c++11 gui c++14
# Set icon
RC_ICONS = icon.ico
SOURCES += \
mainwindow.cpp \
HEADERS += \
mainwindow.h \
FORMS += \
mainwindow.ui \
RESOURCES += \
resources.qrc
## Metrics dependency ##
unix|win32: LIBS += -L$$OUT_PWD/../Metrics/ -lMetrics
INCLUDEPATH += $$PWD/../Metrics
DEPENDPATH += $$PWD/../Metrics
win32:!win32-g++: PRE_TARGETDEPS += $$OUT_PWD/../Metrics/Metrics.lib
else:unix|win32-g++: PRE_TARGETDEPS += $$OUT_PWD/../Metrics/libMetrics.a
Metrics.pro
QT -= gui
TEMPLATE = lib
CONFIG += c++11 gui staticlib
HEADERS += \
metricslib.h
我不确定我是否阅读正确,我有点累,但是如果我正确,这是一个简单的解决方法。
因此,在项目中包含现有文件时,您会在项目中拥有它,但是...这不是您包含它的方式,而是通过文件路径包含头文件,例如,假设主文件为desktop/project/main.cpp
,其中一个标头是desktop/project/GUI/header.h
,另一个是desktop/header2.h
,这是从main.cpp获取它们的方式,
#include <GUI/header.h>
#include <../header2.h>
我知道这是一个uff逼人的例子,但我希望它能过得愉快!
所以我找到了解决方案,但我不认为这是我应该做的。
通过使我的根目录(ClientLauncher)依赖于GUI所依赖的所有内容,并将这些库添加到ClientLauncher的.pro中,我可以在GUI中使用诸如Metrics之类的库。
现在,这似乎是一个奇怪的“修复”,因为ClientLauncher本身并不使用Metrics,所以我仍在寻找一个真正的解决方案。
所以我将ClientLauncher.depends = GUI
更改为ClientLauncher.depends = GUI Metrics
,并将以下内容添加到ClientLauncher.pro
unix|win32: LIBS += -L$$OUT_PWD/../Metrics/ -lMetrics
INCLUDEPATH += $$PWD/../Metrics
DEPENDPATH += $$PWD/../Metrics
win32:!win32-g++: PRE_TARGETDEPS += $$OUT_PWD/../Metrics/Metrics.lib
else:unix|win32-g++: PRE_TARGETDEPS += $$OUT_PWD/../Metrics/libMetrics.a