【问题标题】:header not found in subdir project in qt在 qt 的 subdir 项目中找不到标头
【发布时间】:2015-04-15 09:15:37
【问题描述】:

我有一个简单的子目录项目,在 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,因此我在 nrclib.pro 中添加了适用于 Linux 和 Windows 的适当“包含路径和库”

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

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

我的问题是:为什么要在gui.pro中添加OpenCV的LIBSINCLUDEPATH?为什么它给我“没有这样的文件或目录”对于已经在另一个标题中使用的包含?

抱歉,问了这么长又没用的问题,这让我很烦。

编辑1:我知道this question,但那里没有一个好的答案,应该不需要在gui.pro中添加“OpenCV”,它不需要它。

【问题讨论】:

  • 我编辑了格式,希望我理解你的意思,请至少检查<>""的用法。
  • 我知道 <>"" 之间的区别,我的问题是“将库添加到不需要的 .pro 文件中。”
  • 如果项目中的源代码包含一个.h文件(即使间接通过其他.h文件),那么编译器需要找到.h文件...如果包含它,它需要的。

标签: c++ linux windows qt opencv


【解决方案1】:

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

所以如果 nrclib.h 包含 opencv.h,编译器必须在您包含 nrclib.h 时找到 opencv.h .

它适用于 Linux 可能是因为 opencv.h 是标准包含路径。如果您不使用 subdirs 模板,它也可以工作,因为您只有一个 INCLUDEPATH 用于库和应用程序。但是对于 Windows 上的 subdirs 项目,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 中使用。这是多少额外的代码,取决于你到底需要什么。

【讨论】:

  • 现在我明白了。我在nrclib.cpp 中使用了opencv 标头,它没有问题,但是当我在nrclib.h 中使用它时,它引起了问题,那是因为我在mainwindow.h 中包含nrclib.h,并且nrclib.h 的内容被复制到mainwindow.h。现在很清楚了。感谢您的回答。我应该重写我的代码并删除nrclib.h 中任何与opencv 间接相关的标题。
猜你喜欢
  • 2015-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多