2010-10-12 62 views
3

我试过在没有运气的情况下搜索一个很多(可能是因为我没有使用正确的技术术语)。我的问题主要是关于链接静态库,编译和部署。在详细介绍之前,我的可执行文件在我的系统上编译得很好;主要问题是如何将这些解决方案部署为其他人的工作解决方案。我已经写了一个基本的使用OpenCV静态库的C++图像处理exe文件(我使用项目>属性>链接器>在VC++中链接这些文件>添加了附加的依赖关系,作为标准)。我通过设置VC++选项指向正确的包含文件进行编译...基本上,它都编译得很好。我现在希望能够在另一台PC上部署它。我知道我需要发布版本的exe +静态库...还有其他什么?使用外部库的OpenCV C++应用程序部署

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

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

+0

我建议改变你的标题 - 这是误导性的,不要不要使用便携式词语部署 – 2010-10-12 17:58:22

+1

您永远不需要部署静态库(.lib),因为它们已链接到您的可执行文件中。如果您使用动态库(.dll),则需要部署。话虽如此,你有什么错误? – 2010-10-12 18:00:47

+0

如上所述,libs将链接到.exe中,不需要单独部署。您可以使用Dependency Walker来确保您不会无意中链接到任何非系统DLL(这需要与您的.exe一起部署)。 – Nate 2010-10-12 18:22:14

回答

1

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

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

另外要注意 - 一些.lib文件并不是真正的静态库,而只是一个薄层,它允许连接器在DLL中找到适当的函数并生成动态链接代码,以便程序员不必做那是手工。你通常会看到.lib文件的大小非常小,并且你的应用程序会在exe启动时发现它找不到DLL入口点。

+0

谢谢dark_charlie,我怀疑这是问题,因为其他功能工作正常。我只能找到libjpeg.lib和libpng.lib。我是否将这些与其他库一起添加,还是应该有单独上传的DLL?如果是这样,我应该如何在VC++中引用它们?再次感谢。 – daz 2010-10-12 22:24:02

+0

你应该把DLL,libs永远不会与应用程序分发。你不必在VC++中改变任何东西,只需将DLL复制到exe文件所在的文件夹即可。 – 2010-10-13 09:20:09

+0

好吧,从阅读这里就是我收集的内容: 1.我必须添加libjpeg.lib和libpng。lib项目属性>链接器>输入>其他依赖关系 2.在主CPP代码中包含libjpeg.h和libpng.h。 3.将libjpeg.dll和libpng.dll复制到release exe目录中。 我试过所有这些都没有运气。 – daz 2010-10-13 13:43:38