0

我想创建一个可执行文件,我可以将它移动到另一台没有安装 OpenCV 的计算机上。

因此,我试图将所有需要的库静态链接到可执行文件中(这就是它所谓的对吗?)。该程序编译得很好,可以在我的本地计算机上运行,​​但是当我将它复制到另一台计算机时,它抱怨它缺少 .dll 文件并且不会执行。

我在 Windows 7 上使用 eclipse juno 和 mingw 作为编译器。

到目前为止我的进展:我已将 opencv\build\x86\mingw\lib 所需的库包含到 MinGW C++ 链接器 -> 项目属性中的库中。

opencv_core244.dll
opencv_highgui244.dll
opencv_imgproc244.dll

在原始文件夹中,这些被称为:

libopencv_core244.dll.a
libopencv_highgui244.dll.a
libopencv_imgproc244.dll.a

我已将 MinGW C++ Linker -> miscellaneous 中的链接器标志设置为 -static。

我一直在寻找答案并尝试了一些不同的东西,但我真的被这个难住了。

您如何强制 Eclipse 中的编译器(在本例中为 MinGW)将库链接为静态库而不是像它显然正在做的动态库?

4

2 回答 2

1

1) 如果 OpenCV 已编译为用作 DLL,则不能静态链接。

2) 请记住,当您为 DLL 输出编译项目时,您有一个 .lib 文件。这个 .lib 文件实际上不是带有代码的静态库。编译器使用它来了解类/函数定义的 DLL 名称。这将在运行时需要 DLL。

3) 对于静态链接,您需要编译为静态库的 .lib 文件。在这样的编译中,只有一个输出是 .lib 文件。此 .lib 文件可用于静态链接,并且 .lib 文件中的代码将添加到您的应用程序中。

4) 我刚刚用 VStudio 编译了一个项目,它是一个只有一个功能的 DLL。我得到一个 DLL 和一个 .lib 作为输出。.lib 的大小为 2kb。

5)当我编译与静态库相同的项目时,我只得到一个输出,即 .lib 文件。它的大小是 133kb。

于 2013-04-19T06:41:15.710 回答
1

澄清/答案已经晚了将近一年,但希望它对您或遇到相同问题的任何其他人有所帮助。

虽然 Pruthviraj 没有清楚地解释他的答案,但他的想法是正确的。默认情况下,cmake 的配置文件将“BUILD_SHARED_LIBRARY”标志设置为 true。创建的 .a 文件只是重定向到 dll 文件,本质上对于在程序中进行静态链接毫无用处。

最简单的方法是使用 cmake 重建 OpenCV,但要确保标志“BUILD_SHARED_LIBRARY”设置为 false。如果您使用它,它位于 cmake GUI 中的 Build 子类别下。

新生成的 make 文件应该只在 lib 文件夹中生成静态库,并且应该在您的程序中正确地静态链接 opencv。希望能帮助到你!

于 2014-01-30T19:59:43.700 回答