如何切换到 OpenCV 3.0 的静态库以便 exe 是独立的?

Posted

技术标签:

【中文标题】如何切换到 OpenCV 3.0 的静态库以便 exe 是独立的?【英文标题】:How to switch to static libraries for OpenCV 3.0 so exe is standalone? 【发布时间】:2015-07-02 15:49:41 【问题描述】:

我有一个使用 opencv 3.0 的项目,但是当我尝试在另一台计算机上运行 .exe 时,我得到“此程序无法启动,因为您的计算机缺少 opencv_world300.dll”。

我认为这是因为我没有使用静态库,所以我进入了我的项目属性并进入了 Release(这是我正在构建的模式)并更改了以下内容:

链接器>输入>从 $(OPENCV_DIR)\lib 到 $(OPENCV_DIR)\staticlib 的附加库

然后: Linker>Input>Additional Dependencies from

opencv_ts300.lib
opencv_world300.lib

IlmImf.lib
ippicvmt.lib
libjasper.lib
libjpeg.lib
libpng.lib
libtiff.lib
libwebp.lib
opencv_calib3d300.lib
opencv_core300.lib
opencv_features2d300.lib
opencv_flann300.lib
opencv_hal300.lib
opencv_highgui300.lib
opencv_imgcodecs300.lib
opencv_imgproc300.lib
opencv_ml300.lib
opencv_objdetect300.lib
opencv_photo300.lib
opencv_shape300.lib
opencv_stitching300.lib
opencv_superres300.lib
opencv_ts300.lib
opencv_video300.lib
opencv_videoio300.lib
opencv_videostab300.lib

里面的所有库(我不确定是否需要它们,即使我没有使用它们,所以为了安全起见,我将它们都添加了)。

我还将 C/C++>代码生成>运行时库更改为多线程(/Mt)

但是现在当我编译时,我得到了未解决的符号错误。我做错了什么吗?还是我需要做一些其他事情才能在另一台机器上编译和运行它?

编辑更多信息: 这是未解析的外部符号的屏幕截图:

至于我正在使用的其他库,我使用的是win32库和标准库。这是一个列表:

#include <windows.h>
#include <commctrl.h>
#include <shlobj.h> 
#include <assert.h>
#include <string.h>
#include <vector>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>

【问题讨论】:

您正在使用的任何非 opencv 库(msvc 或 sth?)发布一些未解析的符号消息! 我已经编辑了我的原始帖子以包含我正在使用的错误和其他库。 您的静态链接文件夹中没有zlib.lib 吗?您没有将其添加到您的输入中... 哎呀,里面有一个。我添加了它并编译了:)你能解释一下它到底做了什么,以供将来参考吗?为什么添加这个可以修复其他 .lib 文件中的错误? 我猜其他库正在使用 zlib 压缩和解压缩数据。如果遇到类似问题,您可以搜索缺少的函数引用 _compress _uncompress _deflateEnd 等,以找出这些函数来自哪里 【参考方案1】:

@Micka 指出我的附加依赖项中缺少 zlib.lib 文件。添加它可以解决所有问题。

【讨论】:

以上是关于如何切换到 OpenCV 3.0 的静态库以便 exe 是独立的?的主要内容,如果未能解决你的问题,请参考以下文章

我有一个Xcode静态库项目,如何添加测试目标,以便我可以在那里运行它? (而不是在链接到它的项目中。)

使用静态库构建OpenCV应用程序

OpenCV 3.0 缺少库

opencv静态链接库有啥用

opencv静态链接库cmake链接顺序问题

静态库,链接到共享库