header 在 qt 的子目录项目中找不到

header not found in subdir project in qt

我有一个简单的子目录项目,在 Qt 中有以下文件树:

nrc.pro
gui
   -gui.pro
   -mainwindow.h
   -mainwindow.cpp
   -main.cpp
nrclib
   -nrclib.pro
   -nrclib.h
   -nrclib.cpp
   -otherfile.h
   -otherfile.cpp

nrclib 使用 OpenCV,所以我为 Linux 和 Windows 添加了适当的 "includepath and libs" 到 nrclib.pro

并且gui.pro我已经使用了nrclib作为库,我没有在gui项目中使用任何opencv函数,所以不需要将opencv的includepath和libs添加到gui.pro,并且我在 otherfile.h 中有 #include <opencv/cv.h>nrclib.h 中有 #included "otherfile.h"#include "nrclib.h"mainwindow.h.

到目前为止一切顺利。该项目在 windows 和 Linux 下都运行良好。但是今天我做了一个改变,我在"nrclib.h"中添加了一个函数,它需要opencv,所以我做了#include <opencv/cv.h>nrclib.h。它在 Linux 下完美运行。但是当我想在 Windows 中编译它时,它给了我:"<opencv/cv.h>: no such file or directory"。 如果我删除包含,一切正常。如果我在 Qt 中不使用 "subdir template",就不会有任何问题。 但是如果我在 windows 中使用 subdir 模板,我必须将 OpenCV 的 LIBSINCLUDEPATH 添加到 gui.pro,尽管没有 opencv 相关gui项目中使用了函数,我只在mainwindow.h.

中包含了nrclib.h

我的问题是:为什么要在gui.pro中加入OpenCV的LIBSINCLUDEPATH?为什么它给我 "no such file or directory" 一个已经在另一个 header 中使用的包含?

抱歉问了一个冗长无用的问题,它打扰了我。

edit 1: 我知道 this question 但那里没有很好的答案,应该不需要将 "OpenCV" 添加到 gui.pro,它不需要它。

在 C++(继承自 C)中,#include 有效地通过包含文件的 "copy-pasting" 内容递归地工作。因此,如果您包含包含另一个文件的文件,那么也需要找到另一个文件。

所以如果nrclib.h包含opencv.h,编译器必须找到opencv.h 当你包含 nrclib.h.

它适用于 Linux 可能是因为 opencv.h 是标准包含路径。如果您不使用子目录模板,它也可以工作,因为您只有一个用于库和应用程序的 INCLUDEPATH。但是对于 Windows 上的子目录项目,gui.pro 无法从任何地方获取它。


作为一个实用的建议,您可以创建 nrclib/nrclib.pri,然后添加 nrclib 需要的所有内容,LIBS += ...INCLUDEPATH += ... 等等在。然后在gui.pro中做

include(../nrclib/nrclib.pri)

这样gui.pro就不用直接关心opencv了,只需要包含这个.pri来自另一个子目录项目的文件。


另一种选择是更改 nrclib.h,使其不需要 opencv.h。这可能意味着,你需要从 OpenCV 中包装你需要的任何东西,这样你就不需要在 nrclib.h 中使用。这是多少额外的代码,取决于您从那里到底需要什么。