c++ - 将调用类转换为库本身后,库头文件中没有此类文件
问题描述
我有一个项目,其中 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
解决方案
我不确定我读得对我有点累,但如果我是对的,这是一个简单的解决方法。
因此,当将现有文件包含到您的项目中时,您将其包含在您的项目中,但是......这不是您包含它的方式,您通过文件路径包含头文件,例如,假设主文件是desktop/project/main.cpp
,一个头是desktop/project/GUI/header.h
,另一个是desktop/header2.h
这是从 main.cpp 获取它们的方法,
#include <GUI/header.h>
#include <../header2.h>
我知道这是一个粗略的例子,但我希望它有助于度过美好的一天!
推荐阅读
- spring-boot - 如何防止用户将字段注入表单支持 bean?
- laravel - Laravel eloquent 添加了另一个异常字符串“T”和“.000000Z”至今
- reactjs - 想要在 React.js 中显示来自订单 api 的订单通知
- excel - 为什么在运行“For Loop”的 vba 代码以复制数据时出现“脚本超出范围”错误?
- vba - 如何获取页面/部分的开头?
- python - AWS 弹性 beanstlk cron 作业
- node.js - 当我使用“mongoose.connect”时,Express 服务器没有启动
- javascript - 类型错误:this.props.disses 未定义
- django - 使用 mongoengine 连接到 mongo 云
- javascript - 如何使用 jquery 获取 DOM 中对象的函数?