C++ Windows上OpenCV应用程序的精简构建
我正在读一篇关于如何使用OpenCV为应用程序创建紧凑构建的文章 但是,本文仅包括与GCC相关的优化。我正在VisualStudio中寻找等效的选项,但只能找到最小化大小(/Os)的选项和/LTCG选项 我正在使用从源代码构建的OpenCV静态库构建一个非常简单的OpenCV控制台应用程序(代码如下)。问题是可执行文件的大小太大(调试版本为37 MB,发布版本为19 MB)。我想把这个尺寸缩小到几兆字节,我正在寻找实现这个目标的方法——我在研究这篇文章时发现了这篇文章C++ Windows上OpenCV应用程序的精简构建,c++,visual-studio,opencv,C++,Visual Studio,Opencv,我正在读一篇关于如何使用OpenCV为应用程序创建紧凑构建的文章 但是,本文仅包括与GCC相关的优化。我正在VisualStudio中寻找等效的选项,但只能找到最小化大小(/Os)的选项和/LTCG选项 我正在使用从源代码构建的OpenCV静态库构建一个非常简单的OpenCV控制台应用程序(代码如下)。问题是可执行文件的大小太大(调试版本为37 MB,发布版本为19 MB)。我想把这个尺寸缩小到几兆字节,我正在寻找实现这个目标的方法——我在研究这篇文章时发现了这篇文章 #include <
#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/imgcodecs.hpp>
int main()
{
cv::Mat m = cv::imread("sample.jpg");
cv::imwrite("output.jpg", m);
std::cout << "Hello World!\n" << m.rows << " " << m.cols;
return 0;
}
如果有人对VisualStudio中的等效选项有任何想法,这将非常有帮助
另外,是否有人在VisualStudio上使用静态OpenCV库成功地减小了可执行文件的大小 您可以根据模块要求进行构建,详细信息请参见 最简单的构建方法是使用OpenCV cmake示例:
cmake
-D WITH_CUDA=OFF \
-D WITH_MATLAB=OFF \
-D BUILD_ANDROID_EXAMPLES=OFF \
-D BUILD_DOCS=OFF \
-D BUILD_PERF_TESTS=OFF \
-D BUILD_TESTS=OFF \
-D BUILD_SHARED_LIBS=OFF \
-D BUILD_opencv_objdetect=OFF \
-D BUILD_opencv_video=OFF \
-D BUILD_opencv_videoio=OFF \
-D BUILD_opencv_features2d=OFF \
-D BUILD_opencv_flann=OFF \
-D BUILD_opencv_ml=OFF \
-D BUILD_opencv_photo=OFF \
-D BUILD_opencv_python=OFF \
-D BUILD_opencv_shape=OFF \
-D BUILD_opencv_stitching=OFF \
-D BUILD_opencv_superres=OFF \
-D BUILD_opencv_ts=OFF \
-D BUILD_opencv_videostab=OFF \
-D BUILD_opencv_highgui=ON \
-D BUILD_opencv_imgproc=ON \
..
对于静态链接,您可以通过将.a
取消归档到.o
并将其捆绑到单个.a
中来选择模块。
注意:务必不要破坏依赖关系
例如:
使用ar-x libopencv\u imgproc.a
取消存档.a
,然后再次存档
ar-rc libopencv\u custom.a*.o
您可以根据您的模块要求进行构建,详细信息请参见
最简单的构建方法是使用OpenCV cmake示例:
cmake
-D WITH_CUDA=OFF \
-D WITH_MATLAB=OFF \
-D BUILD_ANDROID_EXAMPLES=OFF \
-D BUILD_DOCS=OFF \
-D BUILD_PERF_TESTS=OFF \
-D BUILD_TESTS=OFF \
-D BUILD_SHARED_LIBS=OFF \
-D BUILD_opencv_objdetect=OFF \
-D BUILD_opencv_video=OFF \
-D BUILD_opencv_videoio=OFF \
-D BUILD_opencv_features2d=OFF \
-D BUILD_opencv_flann=OFF \
-D BUILD_opencv_ml=OFF \
-D BUILD_opencv_photo=OFF \
-D BUILD_opencv_python=OFF \
-D BUILD_opencv_shape=OFF \
-D BUILD_opencv_stitching=OFF \
-D BUILD_opencv_superres=OFF \
-D BUILD_opencv_ts=OFF \
-D BUILD_opencv_videostab=OFF \
-D BUILD_opencv_highgui=ON \
-D BUILD_opencv_imgproc=ON \
..
对于静态链接,您可以通过将.a
取消归档到.o
并将其捆绑到单个.a
中来选择模块。
注意:务必不要破坏依赖关系
例如:
使用ar-x libopencv\u imgproc.a
取消存档.a
,然后再次存档
ar-rc libopencv\u custom.a*.o
感谢您的回复。首先,我不想构建共享库(在您的回复中,build_shared_LIBS处于启用状态)。其次,我已经试着只构建我所需要的模块,但是没有太大的改进,因为在静态链接中(据我所知),编译器只会添加那些使用其功能的库的代码。方法之一是使用,ar
工具。您可以先将.a
提取到.o
中,然后使用ar-x
以及以后在单个中需要哪些库。a
您可以使用ar-c
组合所有这些.o
。这将为您提供用于创建单独模块的所有.o
的单个blob(比如说liballopencv.a
)。我要的是MSVC编译器,而不是GCC/MinGW。感谢您的回复。首先,我不想构建共享库(在您的回复中,build_shared_LIBS处于启用状态)。其次,我已经试着只构建我所需要的模块,但是没有太大的改进,因为在静态链接中(据我所知),编译器只会添加那些使用其功能的库的代码。方法之一是使用,ar
工具。您可以先将.a
提取到.o
中,然后使用ar-x
以及以后在单个中需要哪些库。a
您可以使用ar-c
组合所有这些.o
。这将为您提供用于创建单独模块的所有.o
的单个blob(比如说liballopencv.a
)。