在qt中的subdir项目中找不到标头

时间:2015-02-14 10:31:59

标签: c++ linux windows qt opencv

我有一个简单的子目录项目,在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,所以我添加了适当的" includepath和libs"适用于Linux和Windows的nrclib.pro

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

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

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

对于长期无用的问题感到抱歉,这让我大吃一惊。

编辑1:我知道this question但是那里没有一个好的答案,应该没有必要添加&#34; OpenCV&#34;对于gui.pro,它并不需要它。

1 个答案:

答案 0 :(得分:1)

在C ++中(继承自C),#include有效地通过&#34; copy-pasting&#34;递归地包含文件的内容。因此,如果您包含包含其他文件的文件,则还需要找到另一个文件。

因此,如果 nrclib.h 包含 opencv.h ,那么当你包含 nrclib.h时,编译器必须找到 opencv.h

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


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

include(../nrclib/nrclib.pri)

那样 gui.pro 不需要直接关心opencv,它只需要包含来自另一个子目录项的 .pri 文件。 / p>


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