当前位置: 首页 > 知识库问答 >
问题:

c++ - Qt 使用 OpenCV 时如何解决头文件找不到的问题?

苏彭薄
2024-07-01

qt 使用opencv,添加外部库,一直找不到头文件,应该如何解决

下面是.pro 文件以及.pri 文件

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++17

# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp \
    mainwindow.cpp

HEADERS += \
    mainwindow.h

FORMS += \
    mainwindow.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

include (D:/data/opencv-4.10.0/opencv-4.10.0/_build/opencv.pri)
INCLUDEPATH += D:/data/opencv-4.10.0/opencv-4.10.0/_build/install/include
Debug:{
    LIBS += -lD:/data/opencv-4.10.0/opencv-4.10.0/_build/install/x64/vc17/lib/opencv_world4100d
}
Release:{
    LIBS += -lD:/data/opencv-4.10.0/opencv-4.10.0/_build/install/x64/vc17/lib/opencv_world4100
}

下面是报错信息
image.png

尝试过更改INCLUDPATH 改为 -I………………

共有2个答案

邵子平
2024-07-01

这个问题我已经解决了,主要问题原因不是很清楚,总体来说就是,qt在编辑时和编译时,依赖的路径并不一致,一般情况下, 设置了includepath目录之后,在进行编译时会自动寻找到includepath指定的目录,这是一个自动的过程,然而,在windows环境下,或者说在我的环境下出现了异常,导致在寻找依赖目录时,出现了问题,导致一致报错, 增加一个dependpath就行了,指定的目录跟includepath一致。

下面是AI对这个问题的答复

在 Qt 项目配置中,INCLUDEPATH 和 DEPENDPATH 是两个不同的变量,它们的作用和使用场景有所不同。

INCLUDEPATH
INCLUDEPATH 用于指定编译器在编译过程中查找头文件的路径。当你在代码中使用 #include 指令包含头文件时,编译器会根据 INCLUDEPATH 中指定的路径来查找这些头文件。

例如:

INCLUDEPATH += D:/lib/include
这告诉编译器在 D:/lib/include 目录下查找头文件。

DEPENDPATH
DEPENDPATH 用于指定 qmake 在生成 Makefile 时查找依赖文件的路径。虽然 DEPENDPATH 和 INCLUDEPATH 在某些情况下可以设置为相同的路径,但它们的主要用途不同。DEPENDPATH 主要用于 qmake 在处理依赖关系时查找相关文件。

通常情况下,DEPENDPATH 可以省略,因为 qmake 会自动根据 INCLUDEPATH 来处理依赖关系。然而,在某些复杂的项目中,可能需要显式地设置 DEPENDPATH 来确保 qmake 能够正确处理依赖关系。

配置示例
根据你提供的信息,你的 .pri 文件配置如下:

INCLUDEPATH += D:/lib/include

Debug {

LIBS += -lD:/lib/x64/vc17/lib/opencv_world4100d

}

Release {

LIBS += -lD:/lib/x64/vc17/lib/opencv_world4100

}
注意事项
路径分隔符:在 .pro 和 .pri 文件中,路径分隔符通常使用正斜杠(/)而不是反斜杠(\)。
库文件路径:在 LIBS 中指定库文件路径时,不需要使用 -l 前缀。-l 前缀用于指定库文件名,而不是完整路径。
修改后的配置如下:

INCLUDEPATH += D:/lib/include

Debug {

LIBS += -LD:/lib/x64/vc17/lib -lopencv_world4100d

}

Release {

LIBS += -LD:/lib/x64/vc17/lib -lopencv_world4100

}
结论
通常情况下,INCLUDEPATH 是必需的,而 DEPENDPATH 可以省略。在大多数情况下,INCLUDEPATH 足以确保编译器和 qmake 正确处理头文件和依赖关系。如果你的项目没有特殊需求,可以只设置 INCLUDEPATH。

ai回答的不是很准确,实际上更改后的文件是在includepath下增加了一行
DEPENDPATH += D:/lib/include
汪阿苏
2024-07-01

首先,从您提供的 .pro 文件和 .pri 文件内容以及报错信息来看,有几个潜在的问题可能导致头文件找不到:

  1. 路径分隔符:在 Windows 系统中,路径通常使用反斜杠 \ 作为分隔符,但在 Qt 项目文件中,您应该使用正斜杠 / 作为路径分隔符,因为 Qt 会自动处理这些路径,以便在不同的操作系统上都能正常工作。
  2. LIBS 的使用:在 LIBS 变量中,您应该使用 -L 来指定库的搜索路径,而不是直接指向库文件。-l 用来指定库名(不包括前缀和后缀)。
  3. Debug 和 Release 配置:您已经使用了条件编译来区分 Debug 和 Release 下的库路径,这是正确的。但是,请确保您的构建配置(Debug 或 Release)与 LIBS 变量中定义的配置相匹配。
  4. 库文件的后缀:在 Windows 上,动态链接库(DLL)通常具有 .dll 后缀,而不是 .lib(尽管 .lib 文件是导入库,通常与 DLL 一起使用)。但是,在 LIBS 中,您只需要指定库名(不带后缀),Qt/qmake 会自动处理。
  5. 包含 .pri 文件:确保 opencv.pri 文件存在,并且包含了正确的库和头文件路径。

基于以上分析,这里是您可能需要的修改:

.pro 文件(保持原样,但确保路径使用正斜杠):

QT       += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++17
# ... 其他配置 ...

INCLUDEPATH += D:/data/opencv-4.10.0/opencv-4.10.0/_build/install/include

LIBS_DEBUG  = -LD:/data/opencv-4.10.0/opencv-4.10.0/_build/install/x64/vc17/lib \
               -lopencv_world4100d
LIBS_RELEASE = -LD:/data/opencv-4.10.0/opencv-4.10.0/_build/install/x64/vc17/lib \
               -lopencv_world4100

# 根据构建配置选择库
CONFIG(debug, debug|release) {
    LIBS += $$LIBS_DEBUG
} else {
    LIBS += $$LIBS_RELEASE
}

# ... 其他配置 ...

include (D:/data/opencv-4.10.0/opencv-4.10.0/_build/opencv.pri)

请注意以下几点:

  • 我使用了 LIBS_DEBUGLIBS_RELEASE 变量来分别存储 Debug 和 Release 版本的库路径和名称。
  • 我使用了 -L 来指定库的搜索路径(如果 OpenCV 的库不在系统的标准库路径中)。
  • 我使用了 CONFIG(debug, debug|release) 来根据当前的构建配置(Debug 或 Release)选择正确的库。
  • 确保 opencv.pri 文件包含了任何额外的配置或路径,如果有的话。

最后,如果仍然遇到问题,请检查以下几点:

  • 确保 OpenCV 已经正确安装,并且库和头文件都位于您指定的路径中。
  • 确保您的 Qt 项目配置为使用与 OpenCV 兼容的编译器和工具链。
  • 清除并重新运行 qmake(在 Qt Creator 中,这通常可以通过“清理”和“重新运行 qmake”来完成)。
  • 检查是否有任何拼写错误或路径错误。
 类似资料:
  • 问题内容: 有谁知道在Python中使用C头文件的好方法吗?例如,我有一个包含全局变量的C程序: 我希望能够采用C编译器/链接器生成的二进制文件,并使用Python脚本解析此结构(并可能对其进行修改)。 问题答案: 看一下用Python编写的C ++标头解析器 。您还可以使用以下任何一种工具编写自己的解析器: 剖析 层 勒普 还有更多…

  • 本文向大家介绍VS2019配置OpenCV时找不到Microsoft.Cpp.x64.user的解决方法,包括了VS2019配置OpenCV时找不到Microsoft.Cpp.x64.user的解决方法的使用技巧和注意事项,需要的朋友参考一下 最近在配置OpenCV的时候,由于使用的是VS2019,结果找不到Microsoft.Cpp.X64.user这个文件。导致每次新建项目都得重新配置一遍,后

  • 在尝试返回OrderStatus类的对象时面临此问题。 造成这种情况的主要原因是媒体类型,当我使用application/json进行尝试时,它起了作用,但需要使用自定义媒体类型,如:application/vnd.xyzcompany.v1+json 额外信息:@produces和@consumes用于相同的媒体类型,并且在请求的响应中定义了OrderStatus类。

  • 问题内容: 我正在开发一个事件跟踪系统,该系统使用少数查找表以及主日志记录表。在我撰写的报告中,可以选择一个对象来查看统计信息。界面按重要性递减的顺序显示所有对象(即命中)。 两个表的架构(略有减少,但您能理解以下要点): 我遇到问题的查询如下。我的〜100个条目的表可以正常工作,但是EXPLAIN令我有些担心。 返回值: 那么-有什么错我的架构和/或查询MySQL来依傍和?还是使用ORDER B

  • 本文向大家介绍解决android.support.v4.content.FileProvide找不到的问题,包括了解决android.support.v4.content.FileProvide找不到的问题的使用技巧和注意事项,需要的朋友参考一下 在AndroidManifest.xml中加入下面这段话后, 在Android4.4.2版本的手机出现了下面的错误提示 解决方案: 第一:可能是添加Mu

  • 问题内容: 我已经在Raspberry Pi上的Occidentalis操作系统(Raspbian的变体)上安装了OpenCV,使用的是在此处找到的jayrambhia的脚本。它安装了版本2.4.5。 当我尝试import cv2使用Python程序时,收到以下消息: 该文件cv2.so存储在 在中也有文件夹,这可能是个问题,但我不确定。 这可能是路径错误吗?感谢你的任何帮助,我是Linux的新手