【发布时间】:2015-10-06 14:15:20
【问题描述】:
我尝试在 Qt 中创建一个简单的 Opencv 应用程序,但在运行时,整个应用程序都崩溃了。如果我从项目中注释掉与opencv相关的代码,项目运行得很好。
我做了什么:
Downloaded the Qt 5.5.0 VS2013 64bit version
Downloaded the OpenCV 3.0
Downloaded the Cmake 3.3.2
我解压Opencv包的时候已经有预编译的二进制文件,但是网上所有的教程都希望我重新编译源代码,我也这样做了。包包含:
build
sources
创建了一个名为 mymade 的新文件夹,以将二进制文件保存在其他两个目录旁边。所以它现在看起来像这样:
build
mymade
sources
步骤:
- 启动
CMake,从提取的文件中指定源文件夹 并将mymade指定为二进制文件的输出。 - 检查了名称中包含
opencv的所有选项以及Qt!并对其进行配置并随后生成文件。
这是结果内容:
一切都完成了,我现在需要构建二进制文件。我打开了OpenCV.sln 并编译了发布和调试二进制文件。 dll放在bin目录下,lib文件放在lib目录下。
现在是时候配置 Qt 项目 .pro 文件了,所以我使用了 build 目录中的头文件,而对于 lib,我使用了 mymade 文件夹中的 lib 文件夹。这是我想出的第一个配置,它编译时没有任何链接器问题,但立即崩溃。
项目文件的初始更改:
#-------------------------------------------------
#
# Project created by QtCreator 2015-10-06T14:04:20
#
#-------------------------------------------------
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = OpenCVTest
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp
HEADERS += mainwindow.h
INCLUDEPATH += L://Apps_Installation_Folder//opencv//build//include
LIBS += L://Apps_Installation_Folder//opencv//mymade//lib//Release//*.lib
FORMS += mainwindow.ui
按照this 等答案的建议在项目文件中执行此操作也没有任何好处:
#-------------------------------------------------
#
# Project created by QtCreator 2015-10-06T14:04:20
#
#-------------------------------------------------
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = OpenCVTest
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp
HEADERS += mainwindow.h
INCLUDEPATH += L://Apps_Installation_Folder//opencv//build//include
LIBS += L://Apps_Installation_Folder//opencv//mymade//lib//Release//opencv_core300.lib
LIBS += L://Apps_Installation_Folder//opencv//mymade//lib//Release//opencv_highgui300.lib
LIBS += L://Apps_Installation_Folder//opencv//mymade//lib//Release//opencv_imgcodecs300.lib
LIBS += L://Apps_Installation_Folder//opencv//mymade//lib//Release//opencv_ml300.lib
LIBS += L://Apps_Installation_Folder//opencv//mymade//lib//Release//opencv_objdetect300.lib
LIBS += L://Apps_Installation_Folder//opencv//mymade//lib//Release//opencv_photo300.lib
LIBS += L://Apps_Installation_Folder//opencv//mymade//lib//Release//opencv_shape300.lib
LIBS += L://Apps_Installation_Folder//opencv//mymade//lib//Release//opencv_hal300.lib
LIBS += L://Apps_Installation_Folder//opencv//mymade//lib//Release//opencv_flann300.lib
LIBS += L://Apps_Installation_Folder//opencv//mymade//lib//Release//opencv_features2d300.lib
FORMS += mainwindow.ui
这也失败了:
#-------------------------------------------------
#
# Project created by QtCreator 2015-10-06T14:04:20
#
#-------------------------------------------------
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = OpenCVTest
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp
HEADERS += mainwindow.h
INCLUDEPATH += L://Apps_Installation_Folder//opencv//build//include
LIBS +=-L"L://Apps_Installation_Folder//opencv//mymade//lib//Release"
LIBS += -lopencv_core300 -lopencv_highgui300 -lopencv_imgcodecs300 -lopencv_ml300 -lopencv_objdetect300 -lopencv_photo300 -lopencv_hal300 -lopencv_shape300 -lopencv_flann300 -lopencv_features2d300
FORMS += mainwindow.ui
那么这里的问题是什么?
更新
正如@Miki 指出的那样,Qt 找不到 opencv dll(上面的配置还可以,但是),要解决这个问题,只需将包含 dll 的目录添加到 PATH 变量中,那里你很好,现在一切都很好。
【问题讨论】:
-
我有一个正在运行的构建:
INCLUDEPATH += /path/to/includeLIBS += -L/path/to/lib \ -lopencv_core \ -lopencv_highgui \ -lopencv_imgproc所以基本上你应该从 INCLUDEPATH 中删除 -L,并在 LIBS 中添加 -l 而不是 -L(在第二个 sn-p 中)跨度> -
@Miki:我有点迷路了,L 是文件夹所在的驱动器名称!删除它会使路径无效恕我直言。不是吗?
-
我认为你需要在路径上使用-L,在要链接的lib名称上使用-l,或者直接在完整路径上使用-l lib 链接。但我会选择 -L
-l 。我不是这里的专家,但应该工作。 -
@Miki:如果我理解正确,我也这样做了,但问题仍然存在,我更新了问题以反映我最近的尝试。
-
是的,就是这样。 dll 是否在 PATH 中找到?