减小与 opencv 静态链接的可执行文件的大小

Posted

技术标签:

【中文标题】减小与 opencv 静态链接的可执行文件的大小【英文标题】:decreasing the size of executable which is statically linked with opencv 【发布时间】:2016-10-25 17:38:16 【问题描述】:

我编写了这段代码来使用 opencv 库从网络摄像头捕获照片。

#include <opencv2/highgui/highgui.hpp>
#include<windows.h>
#include<iostream>

using namespace std;
using namespace cv;

void camcapture()

   VideoCapture cap(0);
    char name[100];
int i=0;
while(1)
    Sleep(1000);
    sprintf(name,"%s%d.jpg","test",i++);
Mat save_img;
cap >> save_img;

if(save_img.empty())

  std::cerr << "Something is wrong with the webcam, could not get frame." << std::endl;

// Save the frame into a file
imwrite(name, save_img); // A JPG FILE IS BEING SAVED
printf("image %s saved\n",name);



int main()

    camcapture();


然后我与一些必需的 opencv 库静态链接以使其可移植。当我编译代码时,可执行文件的大小为 4.73, 有没有办法在不影响可移植性的情况下减小可执行文件的大小? 我不想动态链接库。 这是编译日志。

Build started on: 25-10-2016 at 22:52.58
Build ended on: 25-10-2016 at 22:53.00
-------------- Build: Release in cvtest (compiler: GNU GCC Compiler)---------------
mingw32-g++.exe -Wall -fexceptions -O2 -ID:\open\opencv\mybuild4\install\include -ID:\open\opencv\mybuild4\install\include\opencv -ID:\open\opencv\mybuild4\install\include\opencv2 -c D:\c_cpp_codes\cvtest\main.cpp -o obj\Release\main.o
mingw32-g++.exe -LD:\open\opencv\mybuild4\install\x86\mingw\staticlib -o bin\Release\cvtest.exe obj\Release\main.o -s D:\open\opencv\mybuild4\lib\libopencv_world310.a D:\open\opencv\mybuild4\3rdparty\lib\liblibjpeg.a D:\open\opencv\mybuild4\3rdparty\lib\liblibwebp.a D:\open\opencv\mybuild4\3rdparty\lib\liblibtiff.a D:\open\opencv\mybuild4\3rdparty\lib\liblibpng.a D:\open\opencv\mybuild4\3rdparty\lib\liblibjasper.a D:\open\opencv\mybuild4\3rdparty\lib\libIlmImf.a D:\open\opencv\mybuild4\3rdparty\lib\libzlib.a C:\MinGW\lib\Vfw32.Lib C:\MinGW\lib\Uuid.Lib C:\MinGW\lib\Ole32.Lib C:\MinGW\lib\OleAut32.Lib
Output file is bin\Release\cvtest.exe with size 4.73 MB
Process terminated with status 0 (0 minute(s), 1 second(s))
0 error(s), 0 warning(s) (0 minute(s), 1 second(s))

【问题讨论】:

尝试为编译器和链接器添加-flto 标志。它启用链接时间优化,并应从可执行文件中删除未使用的代码。 -flto 选项将大小从 4.73MB 增加到 4.75MB 这很奇怪。您确定为编译器和链接器都添加了此选项吗? 是的,为编译器和链接器添加。 我想你必须用这个标志重新编译所有外部库。 【参考方案1】:

这取决于你想如何使用它。除了 cmets 中的响应外,您还可以使用可执行打包程序,例如 UPX。

【讨论】:

以上是关于减小与 opencv 静态链接的可执行文件的大小的主要内容,如果未能解决你的问题,请参考以下文章

静态库,链接到共享库

动态链接库与静态链接库的区别

错误 itms-90122 - 无效的可执行文件大小

Linux动态和静态链接

QT Creator 中的部署和静态打包将 QT 和 OpenCV 链接到单个可执行文件中

与动态库链接导致的可执行运行时崩溃