首页 > 解决方案 > 将调用类转换为库本身后,库头文件中没有此类文件

问题描述

我有一个项目,其中 ClientLauncher 是执行子目录。我还有两个库 GUI 和 Metrics。

最初 ClientLauncher 和 GUI 是“一个”,使用 Metrics 库,一切都很好。但是我现在"filename.h": No such file or directory在每个 GUI 包含来自 Metrics 的东西的地方编译程序时都会得到。

我改变这个的原因是因为我希望能够在另一个库 UnitTests 中测试我的所有代码。出于这个原因,我希望将所有内容都放在一个库中,以便 UnitTests 可以使用该代码。

所以 GUI 现在是一个库,但它曾经是程序的开始。要将其转换为库,我将其添加TEMPLATE = lib到 .pro 中,如下所示。

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
}

图形用户界面/主窗口.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include "metricslib.h" //ERROR: metricslib.h: No such file or directory

#endif

指标/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

图形用户界面.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++qtbuilding

解决方案


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

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

   #include <GUI/header.h>

   #include <../header2.h>

我知道这是一个粗略的例子,但我希望它有助于度过美好的一天!


推荐阅读