在Windows上使用Opencv、Mingw和静态库出现错误,如何制作便携程序?

3
我的最终目标是拥有一个便携式Opencv程序,我可以轻松安装并在其他Windows计算机上使用。我已成功使用codeblocks和Mingw编写了程序。
目前,我有一个功能正常的程序,它使用OpenCV的动态链接库。但是当我将可执行文件移动到任何地方时,它都找不到dlls。
我尝试使用静态库,这样我就不必在运行程序的计算机上安装Opencv,并且一切都可以从可执行文件中运行。以下是我所采取的步骤。
1.使用CMAKE、Opencv源码和Mingw64编译静态库,使用BUILD_SHARED_LIB = OFF。这给我一系列的libopencv_xxxxx.a(我看到使用opencv和qt时出现了类似的问题,编译器标志在这些名称前面添加了“lib”,导致错误-在codeblocks中不是这种情况。)
2.将Codeblocks构建选项设置如下:
当我构建这个项目时,会出现一系列“未定义参考”的错误。
例如。
Build Messages
C:\opencv\build\x64\mingw (static)\staticlib\libopencv_core2410.a(persistence.cpp.obj):persistence.cpp:(.text_ZL12icvCloseFileP13CvFileStorage+0x5a)||undefined reference to `gzclose'|
Build Log
C:\opencv\build\x64\mingw (static)\staticlib\libopencv_core2410.a(persistence.cpp.obj):persistence.cpp:(.text_ZL12icvCloseFileP13CvFileStorage+0x5a): undefined reference to `gzclose'
如果您对这些错误有任何建议,将不胜感激。
我也在考虑,可能我是完全错误的(我的电气工程学位曾暴露于许多编程环境,但我可能忽略了一些基本的软件工程组件。)
以下是我考虑过的其他事情:
  1. 使用Visual Studios - opencv库已经预编译,目标计算机运行的是Windows系统,所以这似乎很合理 - 我尝试了一些实验,但使用Visual Studios让我感到沮丧。我正在成为一个Linux爱好者,不想浪费时间学习与Windows相关的编程。

  2. 在Codeblocks中使用Visual Studios编译器 - Codeblocks中唯一的选择是使用Visual C++ 2010 - 我似乎无法使用VC11或VC12在CodeBlocks中进行编译。此外,我看到Visual C++已安装,但似乎找不到其文件夹。(总之,我尝试了一些没有立即产生积极结果的方法)

  3. 使用安装程序 - 我没有安装程序的经验,但也许比尝试将库链接到可执行文件中更容易。我认为可以设置安装程序将所有依赖项存储在Program Files中,并在方便的位置放置可执行文件的快捷方式。这是真的吗?需要多大的难度?

  4. 手动组织一个带有依赖项的便携式文件夹。对此并没有太多经验,但也许比链接库更容易。

请随意评论其他选项或提供任何可能被忽略的解决方案。


1
请检查一下这个链接是否解决了你的问题:https://dev59.com/7V3Va4cB1Zd3GeqPB5n4(基本上,将-lz添加到你的链接器选项中)。另外,[这个链接](https://dev59.com/A2HVa4cB1Zd3GeqPnoUa)可能也与你的问题相关。 - Antonio
如果你正在进行静态链接,你还需要链接一些辅助库,例如:-lrt -ldl -lz -lpthread。 在Linux上也是一样的!(你的错误提示缺少 zlib [-lz]) - berak
2个回答

1

将编译器设置为用于构建OpenCV静态库的编译器可能是解决方案。

例如,我使用MinGW 4.7.1构建OpenCV,那么我应该在Code Blocks中设置编译器为相同的编译器(MinGW 4.7.1)。


1
我也曾遇到过问题,使用OpenCV3.1.0、CMake3.4.2和MinGW5.3.0结合code:blocks获取独立的.exe文件。由于我对OpenCV和c++相对较新,解决方案可能比必要的更复杂,但至少对我而言有效。我的解决方案如下:
  1. 按照 BUILD_SHARED_LIB = OFF 的方式制作静态库,生成 .a 静态文件(而不是 .dll.a 文件)。Cmake 会创建 my_static_build\install\ 目录,所以在设置其他 CMAKE_INSTALL_PREFIX 时可能会更改文件夹。

  2. Code:blocks: 使用 gcc 和 g++ 作为编译器;修改项目 -> 构建选项(不是设置 -> 编译器,但可能无关紧要):

    2.1 编译器设置 -> 编译器标志:让 g++ 遵循 C++11 ISO C++ 语言标准;完全优化(用于加速)

    2.2 链接器设置 -> 链接库:我添加了所有位于目录 C:\OpenCV\my_static_build\lib 和 C:\OpenCV\my_static_build\install\x86\mingw\staticlib 下的 .a 文件。这大约有 90 个 .a 文件。

    2.3 链接器设置 -> 其他链接器选项:-static -static-libstdc++

    2.4 搜索目录 -> 编译器:C:\OpenCV\my_static_build\install\include

    2.5 搜索目录 -> 链接器:C:\OpenCV\my_static_build\lib


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