OpenCV c++ 应用程序部署与外部库

Posted

技术标签:

【中文标题】OpenCV c++ 应用程序部署与外部库【英文标题】:OpenCV c++ application deployment with external libraries 【发布时间】:2010-10-12 17:52:32 【问题描述】:

我尝试了很多搜索但没有运气(可能是因为我没有使用正确的技术术语)。我的问题主要与链接静态库、编译和部署有关。在我详细介绍之前,我的可执行文件在我的系统上编译得很好;主要问题是如何将这些部署为其他人的有效解决方案。

我已经编写了一个基本的 c++ 图像处理 exe,它使用 OpenCV 静态库(我在 VC++ 中使用 Project>Properties>Linker> 添加附加依赖项作为标准链接这些)。我通过设置 VC++ 选项指向正确的包含文件进行编译...基本上,它编译得很好。我现在希望能够在另一台 PC 上部署它。我知道我需要 exe + 静态库的发布版本......还有什么其他的吗?

一些库依赖于使用 libjpeg 和 libpng;我不认为这些是标准的。此外,我已将静态库的链接器路径设置为相对的(例如资源/库),因此它不依赖于系统,因此它知道在哪里可以找到库。基本的 OpenCV 数据结构工作正常(例如 CvPoint),但是当我尝试使用 CvLoadImage 加载图像时,应用程序崩溃。如果我使用标准 ifstream fopen 代替,我可以毫无问题地打开文件(但似乎无法将其放入 IplImage OpenCV 图像支柱 - 有谁知道如何做到这些?可能与 IplImage->imageData 有关。) .

非常感谢任何帮助。谢谢!

【问题讨论】:

我建议您更改您的标题 - 这是误导性的,不要使用“便携”一词,使用“部署”一词 您永远不需要部署静态库 (.lib),因为它们已链接到您的可执行文件中。如果您使用动态库 (.dll),则需要部署。话虽如此,您遇到了什么错误? 如上所述,libs 会链接到 .exe 中,不需要单独部署。您可以使用 Dependency Walker 来确保您不会无意中链接到任何非系统 DLL(需要与您的 .exe 一起部署)。 一些静态库只是调用 DLL 的引用。您可能必须使用可执行文件(同一目录或 windows 目录)部署 dll 感谢所有的提醒和清除链接方面的困惑。使用 dll 如何在 VC++ 中引用/链接/包含它们以及在哪里指定相对路径?干杯。 【参考方案1】:

静态库不必(也不应该)与应用程序一起分发。静态库由链接器内置到 exe 文件中。 OpenCV 崩溃的原因是它找不到 libpng/libjpeg dll。 OpenCV 不会将它们链接为静态依赖项,而是在运行时使用 LoadLibrary/dlopen API。如果这些调用失败,则可能没有很好的恢复并且应用程序崩溃。如果您包含 libpng/libjpeg 库,您的问题应该会得到解决。 还要注意 - 一些 .lib 文件并不是真正的静态库,而只是一个薄层,它允许链接器在 DLL 中找到适当的函数并生成动态链接代码,这样程序员就不必手动执行此操作.您通常会从 .lib 文件大小中看到它非常小,并且您的应用程序会在 exe 启动时哭泣它找不到 DLL 入口点。..

【讨论】:

感谢 dark_charlie,我曾怀疑这是问题所在,因为其他功能工作正常。我只能找到 libjpeg.lib 和 libpng.lib。我是否将这些与其他库一起添加,还是应该有我单独上传的 DLL?如果是这样,我应该如何在 VC++ 中引用它们?再次感谢。 您应该放置 dll,lib 永远不会与应用程序一起分发。您不必在 VC++ 中更改任何内容,只需将 DLL 复制到 exe 所在的文件夹即可。 好的,所以通过阅读这就是我收集的内容:1.我必须在项目属性>链接器>输入>附加依赖项中添加 libjpeg.lib 和 libpng.lib 2.包括 libjpeg.h和主 CPP 代码中的 libpng.h。 3、将libjpeg.dll和libpng.dll复制到release exe目录下。我已经尝试了所有没有运气的方法。 您自己编译过 OpenCV 还是使用了预编译的二进制文件?如果是你自己,当你在调试器中运行程序时,程序在哪一行崩溃? 嗨,谢谢,我在搞砸了很久之后终于找到了某个地方。我不知道它到底做了什么,但它很乏味!再次感谢您的建议。

以上是关于OpenCV c++ 应用程序部署与外部库的主要内容,如果未能解决你的问题,请参考以下文章

Python、线程、GIL 和 C++

将 C# 类库导入 Visual C++

无法在 android 上使用 C++ OpenCV 打开相机

QT Widget使用OpenCV错误部署到Android [重复]

opencv 和 c++ 编译版本无需运行库

如何在带有 VB.net GUI 的 C++ OpenCV 项目中使用 C# 库?