我有一个简单的子目录项目,在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"
#include <opencv/cv.h>
。它在Linux下运行良好。但是当我想在Windows中编译它时,它会给我:"<opencv/cv.h>: no such file or directory"
。
如果我删除包含,一切都很完美。如果我不使用&#34; subdir模板&#34;在Qt,没有任何问题。
但是如果我在windows中使用subdir模板,我必须将LIBS
和INCLUDEPATH
的OpenCV添加到 gui.pro ,虽然在gui项目中没有使用opencv相关函数,但我有仅包含在 mainwindow.h中的 nrclib.h 。
我的问题是:我为什么要在gui.pro中添加OpenCV的LIBS
和INCLUDEPATH
?为什么它给了我&#34;没有这样的文件或目录&#34;对于已经在另一个标题中使用的包含?
对于长期无用的问题感到抱歉,这让我大吃一惊。
编辑1:我知道this question但是那里没有一个好的答案,应该没有必要添加&#34; OpenCV&#34;对于gui.pro,它并不需要它。
答案 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中使用。这是多少额外的代码,取决于你究竟需要什么。