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 的 LIBS
和 INCLUDEPATH
添加到 gui.pro,尽管没有 opencv 相关gui项目中使用了函数,我只在mainwindow.h.
中包含了nrclib.h
我的问题是:为什么要在gui.pro中加入OpenCV的LIBS
和INCLUDEPATH
?为什么它给我 "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 中使用。这是多少额外的代码,取决于您从那里到底需要什么。
我有一个简单的子目录项目,在 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 的 LIBS
和 INCLUDEPATH
添加到 gui.pro,尽管没有 opencv 相关gui项目中使用了函数,我只在mainwindow.h.
我的问题是:为什么要在gui.pro中加入OpenCV的LIBS
和INCLUDEPATH
?为什么它给我 "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 中使用。这是多少额外的代码,取决于您从那里到底需要什么。