使用外部库的OpenCV c ++应用程序部署

时间:2010-10-12 17:52:32

标签: c++ deployment static opencv shared-libraries

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

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

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

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

1 个答案:

答案 0 :(得分:1)

静态库不必(也不应该)与应用程序一起分发。静态库由链接器内置到exe文件中。

OpenCV崩溃的原因是它无法找到libpng / libjpeg dll。 OpenCV不会将它们链接为静态依赖项,而是在运行时使用LoadLibrary / dlopen API。如果这些调用失败,可能没有很好的恢复,应用程序崩溃。如果包含libpng / libjpeg库,则应修复问题。

还要注意 - 一些.lib文件不是真正的静态库,而只是一个薄层,允许链接器在DLL中找到适当的函数并生成动态链接代码,这样程序员就不必手动执行。您通常会看到.lib文件的大小非常小,而且您的应用程序在启动时无法找到DLL入口点。