使用OpenCV 3.0链接时出现“未解决的外部符号”错误

3
我从源代码构建了OpenCV 3.0,并使用contrib repo添加了一些额外的模块。我手动设置了VS2013项目以使用生成的lib文件。
目前我的代码很简单:
#include "opencv2\core\core.hpp"
#include "opencv2\imgcodecs\imgcodecs.hpp"

int _tmain(int argc, _TCHAR* argv[])
{
    cv::Mat image = cv::imread("img.jpg");
    return 0;
}

但是在VS 2013社区版中,它会给我报错:

enter image description here

我看到类似的线程,他们说这是由于x86 / x64问题引起的。但是我的项目已经是x86了。我构建的OpenCV也针对x86(如下所示)。可能是什么原因呢?

enter image description here

添加1

OpenCV 3.0 INSTALL项目生成以下库目录:

因此,它确实是一个x86目录。

enter image description here

我的库路径已配置为上述路径:

enter image description here

我添加了所有的*d.lib文件。

enter image description here

以下是我的 VC 项目的 配置管理器

enter image description here

因此,它确实也是 x86

可能出了什么问题?

ADD 2

我手动搜索了 fastFree() 函数。它在 opencv_core300d.lib 文件中定义。我使用 dumpbin /symbols 命令来检查符号。我发现它的名称被编码为 fastFree@cv@@YAXPAX@Z。那么为什么找不到它呢?


1
看起来你正在从源代码编译OpenCV。如果是这样,你是否也构建了INSTALL项目,将库放置在正确的位置?或者你可以直接下载预编译的库。 - Miki
@Miki 是的,我正在从源代码编译,因为我需要使用一些在官方版本中未包含的额外模块。是的,我构建了 INSTALL 项目。该项目会将库文件放置在类似于这样的位置:..\ install\x86\vc12\staticlib,我将其作为附加库路径添加到了我的 VC 项目中。我已在问题中添加了截图。 - smwikipedia
我假设你也在链接器 -> 输入 -> 附加依赖项中添加了 opencv_coreXXX 等,对吗? - Miki
@Miki 是的,我将它们添加为 *d.lib。请查看我新添加的截图。 - smwikipedia
@Miki 我改用了OpenCV 3.0.0的官方版本,但是出现了完全相同的错误。 - smwikipedia
显示剩余3条评论
1个回答

7

以下是使用OpenCV 3.0.0预编译库的步骤,为一个链接OpenCV静态库的C++项目,在Windows (已测试Windows 8.1)和Visual Studio (已测试Visual Studio 2013)中运行此程序:

#include <opencv2\opencv.hpp>
using namespace cv;

int main()
{
    Mat3b img = imread("path_to_image");
    imshow("img", img);
    waitKey();
    return 0;
}
  1. http://opencv.org/downloads.html下载
  2. 解压缩
  3. 设定OPENCV_DIR为以下目录的父级目录:
    • build
    • source
  4. 创建一个空项目:
    • 新建项目 -> Visual C++ -> 空项目
  5. 添加一个cpp文件(例如Start.cpp)用于包含您的main函数(例如上面的片段)
  6. 配置DEBUG
  7. 添加include和lib目录:
    • 属性 -> VC++ 目录
    • 包含目录: 添加 OPENCV_DIR\build\include
    • 库目录: 添加 OPENCV_DIR\build\x86\vc12\staticlib
  8. 添加所需的库(以下对于此简单示例很好,如果您需要其他功能,请添加更多):

    • opencv_core300d.lib
    • opencv_highgui300d.lib
    • opencv_imgproc300d.lib
    • opencv_hal300d.lib
    • opencv_imgcodecs300d.lib
    • libjpegd.lib;
    • libpngd.lib
    • libjasperd.lib
    • IlmImfd.lib
    • libtiffd.lib
    • libwebpd.lib
    • zlibd.lib
    • ippicvmt.lib
    • %(AdditionalDependencies)
  9. 属性 -> C/C++ -> 代码生成 -> 运行库

    • 设定为多线程调试(/MTd)
  10. 对于发布版本,您需要在步骤6到9中以发布模式完成操作,在步骤8中添加没有尾随“d”的库,在步骤9中使用多线程(/MT).

  11. 享受吧!

作为奖励,我还推荐安装Visual Studio的Image Watch扩展。非常有用来调试Mat


我将你的设置与我的进行了比较。看起来我不能使用 *d.lib 作为所有库文件的缩写。我改成分别列出库文件,现在编译正常了。我正在使用 VS2013 Community 版本。谢谢。 - smwikipedia
而且,我发现我的构建中缺少 IlmImfd.lib。在官方构建中,这是一个相当大的库(几乎28M)。但即使没有它,它仍然可以编译。不确定它是用来做什么的。 - smwikipedia
无法在3.3.1版本中使用:致命错误LNK1104:无法打开文件'opencv_world311d.lib' - Schütze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接