【问题标题】:Compact build for OpenCV applications on WindowsWindows 上 OpenCV 应用程序的紧凑构建
【发布时间】:2020-08-18 12:16:33
【问题描述】:

我正在阅读 this 文章,了解如何使用 OpenCV 为应用程序创建紧凑的构建。

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

我正在使用从源代码构建的 OpenCV 静态库构建一个非常简单的 OpenCV 控制台应用程序(代码如下)。问题是可执行文件的大小太大(调试版本为 37 MB,发布版本为 19 MB)。我想将该大小减小到几 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;
}

以防万一有人想知道,我包括以下库(以下是发布模式):

opencv_core430.lib
opencv_imgproc430.lib
opencv_imgcodecs430.lib
libjpeg-turbo.lib
libpng.lib
libtiff.lib
libwebp.lib
ippiw.lib
zlib.lib
IlmImf.lib
libjasper.lib
ittnotify.lib
ippicvmt.lib

如果有人对 Visual Studio 中的等效选项有任何想法,那将非常有帮助。

另外,有没有人成功地在 Visual Studio 上使用静态 OpenCV 库减小了可执行文件的大小?

【问题讨论】:

    标签: c++ visual-studio opencv


    【解决方案1】:

    您可以根据您的模块要求进行构建,详情请参阅blog

    最简单的构建方法是使用 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_imgproc.a 取消归档 .a 并再次归档 ar -rc libopencv_custom.a *.o

    【讨论】:

    • 感谢您的回复。首先,我不想构建共享库(在您的回复中,BUILD_SHARED_LIBS 为 ON)。其次,我已经尝试只构建我需要的模块,但这并没有带来太大的改进,因为在静态链接中(据我所知),编译器只会添加那些功能被使用的库的代码。
    • 其中一种方法是使用ar工具。您可以先将.a 提取到.o,然后使用ar -x,然后在单个.a 中使用您需要的任何库,您可以使用ar -c 组合所有这些.os。这将为您提供用于创建单独模块的所有 .os 的单个 blob(假设为 liballopencv.a)。
    • 我想要 MSVC 编译器而不是 GCC/MinGW。
    猜你喜欢
    • 2016-04-22
    • 1970-01-01
    • 2019-01-02
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    相关资源
    最近更新 更多