将调用类转换为库本身后,库头文件上没有这样的文件

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

我有一个项目,其中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
c++ qt building
2个回答
0
投票

我不确定我是否阅读正确,我有点累,但是如果我正确,这是一个简单的解决方法。

因此,在项目中包含现有文件时,您会在项目中拥有它,但是...这不是您包含它的方式,而是通过文件路径包含头文件,例如,假设主文件为desktop/project/main.cpp,其中一个标头是desktop/project/GUI/header.h,另一个是desktop/header2.h,这是从main.cpp获取它们的方式,

   #include <GUI/header.h>

   #include <../header2.h>

我知道这是一个uff逼人的例子,但我希望它能过得愉快!


0
投票

所以我找到了解决方案,但我不认为这是我应该做的。

通过使我的根目录(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
© www.soinside.com 2019 - 2024. All rights reserved.