首页 > 解决方案 > 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 中不可见。

标签: c++qt

解决方案


在我的项目中,如果mainusesblablauses blub,我与和都有main链接。即使不需要包含路径,也必须与 libblub.so 链接。这是我只在 Linux 下才注意到的情况。blabulbmainblubmain

因此,在 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必须同时链接blablub)。


推荐阅读