C++ Windows上OpenCV应用程序的精简构建

C++ Windows上OpenCV应用程序的精简构建,c++,visual-studio,opencv,C++,Visual Studio,Opencv,我正在读一篇关于如何使用OpenCV为应用程序创建紧凑构建的文章 但是,本文仅包括与GCC相关的优化。我正在VisualStudio中寻找等效的选项,但只能找到最小化大小(/Os)的选项和/LTCG选项 我正在使用从源代码构建的OpenCV静态库构建一个非常简单的OpenCV控制台应用程序(代码如下)。问题是可执行文件的大小太大(调试版本为37 MB,发布版本为19 MB)。我想把这个尺寸缩小到几兆字节,我正在寻找实现这个目标的方法——我在研究这篇文章时发现了这篇文章 #include <

我正在读一篇关于如何使用OpenCV为应用程序创建紧凑构建的文章

但是,本文仅包括与GCC相关的优化。我正在VisualStudio中寻找等效的选项,但只能找到最小化大小(/Os)的选项和/LTCG选项

我正在使用从源代码构建的OpenCV静态库构建一个非常简单的OpenCV控制台应用程序(代码如下)。问题是可执行文件的大小太大(调试版本为37 MB,发布版本为19 MB)。我想把这个尺寸缩小到几兆字节,我正在寻找实现这个目标的方法——我在研究这篇文章时发现了这篇文章

#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
)。