我想创建一个可执行文件,我可以移动到另一台没有安装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中设置了链接器标志 - >杂项到 - 静态。
我一直在寻找很多答案,并尝试了一些不同的东西,但我真的很难过。
如何强制eclipse中的编译器(在本例中为MinGW)将库链接为静态库而不是动态库,因为它显然在做什么?
答案 0 :(得分: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。
答案 1 :(得分:1)
这是近一年的澄清/回答,但希望它对您或遇到同样问题的任何其他人都有用处。
虽然Pruthviraj没有清楚地解释他的答案,但他有正确的想法。默认情况下,cmake的配置文件将“BUILD_SHARED_LIBRARY”标志设置为true。创建的.a文件只是重定向到dll文件,实际上无法在程序中静态链接。
最简单的方法是使用cmake重建OpenCV,但要确保将标志“BUILD_SHARED_LIBRARY”设置为false。如果你正在使用它,它在cmake GUI的Build子类下。
新生成的make文件应该只在lib文件夹中生成静态库,并且应该在程序中正确地链接opencv。希望它有所帮助!