c++ - C1083 使用多个子项目时无法打开包含文件
问题描述
我尝试在 Qt 5.x 中使用多个带有动态链接库的子项目(尝试使用 5,13 和 5.8)。
我使用 Qt Creator 并创建了一个主要的小部件项目和一些简单的库。
在主项目中,我使用 Qt 创建器将另一个项目作为内部库包含在内。
我还在顶级文件夹的 .pro 文件中添加了依赖项
TEMPLATE = subdirs
SUBDIRS += \
bla \
blub \
main \
untitled
bla.depends = blub untitled
main.depends = bla blub
在每个子项目中都有一个 *_global,其中定义了 EXPORT
#if defined(BLA_LIBRARY)
# define BLA_EXPORT Q_DECL_EXPORT
#else
# define BLA_EXPORT Q_DECL_IMPORT
#endif
在 mainwindow.cpp 我可以包含另一个子项目的头文件,例如
#include "bla.h"
...
Bla *bla = new Bla();
把#include "bla.h"放在mainwindow.h中也没有问题
我还可以在 main 中包含例如 blub.h。
我的问题是使用另一个库中的其他库之一。
我做同样的步骤。
在 bla.pro
win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../blub/release/ -lblub
else:win32:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../blub/debug/ -lblub
else:unix: LIBS += -L$$OUT_PWD/../blub/ -lblub
INCLUDEPATH += $$PWD/../blub
DEPENDPATH += $$PWD/../blub
现在,只要我尝试“#include blub.h”,就会出现以下问题:
如果我在 bla.h 的标头中执行此操作,则会发生该文件无法找到的错误。(没有这样的文件或目录)
有趣的是,我可以将它包含在 bla.c 中,但是一旦创建了对象 blub,它就会在执行过程中崩溃。
现在我在理解 Qt 的行为时遇到了问题。
如果我在 mainwindow.h 中包含 blub.h,我也可以在 bla.h 中的另一个项目中包含 blub.h。没有错误,没有丢失文件,执行过程中崩溃。但是这个“修复”似乎是完全错误的。
我在使用其他库中的库时是否有一些误解?为什么我只能在从不首先使用库的小部件中包含它时才包含它?
背景:我想使用一种策略模式,并为不同的策略提供接口。该策略应该被进一步封装,并且在最初的位置从 UI 中不可见。
解决方案
在我的项目中,如果main
usesbla
和bla
uses blub
,我与和都有main
链接。即使不需要包含路径,也必须与 libblub.so 链接。这是我只在 Linux 下才注意到的情况。bla
bulb
main
blub
main
因此,在 main.pro 中,只需替换
else:unix: LIBS += -L$$OUT_PWD/../bla/ -lbla
经过
else:unix: LIBS += -L$$OUT_PWD/../bla/ -lbla -L$$OUT_PWD/../blub/ -lblub
没有更多的变化,它的工作原理。
我发现这篇文章引用了类似的情况。根据答案-fPIC
应该可以解决问题(然后main
只能链接bla
),但我检查过,-fPIC
默认情况下在我的构建环境中使用它并不能解决问题(main
必须同时链接bla
和blub
)。
推荐阅读
- reactjs - 如何在 React Gatsby 和 React-Bodymoving 中使用“webpack.DefinePlugin”?
- c# - 计算用户输入
- python - 在带有主管的 Droplet 服务器上运行 Airflow 时出现问题
- kotlin - Kotlin:从末尾拆分字符串
- javascript - 如何更改 FormControl type="email" 的标准警报消息?
- amazon-web-services - AWS AppSync 订阅在网络状态更改期间未触发
- python - 尝试使用python连接到mongodb atlas时连接超时
- arrays - 如何跳过分隔字符串表数组中的隐藏行或列
- javascript - 如何在 javascript 中使用 html2pdf 从 div HTML 制作 PDF,但对于移动和 pc 视图相同
- c# - 在 Windows 10 上获取已连接的蓝牙设备列表