如何在 WSL2 上使用 OpenCV 加快 C++ 项目的构建速度? [关闭]

Posted

技术标签:

【中文标题】如何在 WSL2 上使用 OpenCV 加快 C++ 项目的构建速度? [关闭]【英文标题】:How can I speed up build of c++ project using OpenCV on WSL2? [closed] 【发布时间】:2020-12-25 21:27:29 【问题描述】:

我有一个使用 OpenCV 库的 c++ 项目。当我运行make 时,构建需要很长时间。如何加快构建时间?

我确实安装了支持 GPU 的 OpenCV,并认为这可能是瓶颈(因为它可能正在为不同的 GPU 架构进行编译?),所以我尝试使用 cmake -D WITH_CUDA=OFF .. 来构建我的项目。不幸的是,这并没有奏效……有什么建议吗?

注意:如果 GPU 显着加快编译时间,我可以禁用它。

这是我的 CMakeLists.txt 文件的样子:

cmake_minimum_required(VERSION 3.10)
project(Cruisin VERSION 1.0)
find_package( OpenCV REQUIRED)
find_package (Threads)

include_directories(include)
include_directories( $OpenCV_INCLUDE_DIRS )

file(GLOB SOURCES src/*.cpp app/main.cpp)

add_executable(main $SOURCES)
target_link_libraries( main $CMAKE_THREAD_LIBS_INIT ) # Add threading lib
target_link_libraries( main $OpenCV_LIBS )

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

其他细节:

编译器:gcc

操作系统:虚拟 Ubuntu 20.04(Windows 10 上的 WSL2)

项目结构:ROOT/app/有一个主cpp文件,ROOT/src/有2个源文件,ROOT/include/有2个对应的头文件

OpenCV 和我的项目文件位于常规 Windows 文件系统上(通过 /mnt/ 目录访问),但 CUDA 和 Make/CMake 位于虚拟 WSL 中

编辑:解决方案

问题似乎是在 Windows 文件系统中完成任何 I/O 时 WSL 非常慢。就我而言,我使用的是安装在 mnt/(Windows 文件系统)中某处的 OpenCV。我在 WSL 中 / 的某个地方重建了 OpenCV,并将我的项目也移到了那里,而且速度要快得多。

【问题讨论】:

我们是在谈 10 多分钟还是几个小时,还是什么?我没有注意到使用 OpenCV 的典型项目需要花费异常长的时间才能在具有 6 个或更多内核的现代 cpu 上构建。 我们谈了 10 多分钟。话虽如此,这个 cpp 项目还没有发生太多事情(文件很少,行不多),但是我能够在 1-2 分钟内编译一个大小相当的不同 OpenCV 项目......我不是确定为什么这个项目需要这么长时间 请发布构建过程的日志。我们需要看看正在建造什么,以及是否有必要。 CMakeLists.txt 看起来不错,并且与该主题的许多其他脚本相似。细节可能在您的源文件、平台、编译器中……但您没有描述它们。那么,您希望我们提供哪些信息? 好吧,你有几行来自 CMake/Make 执行构建和链接你的源文件。其中哪一行花费了最多的时间?这个金额是多少?由于您使用 WSL2,因此它对来宾文件系统(在您的情况下为 Ubuntu 20.04)内部和外部的文件具有不同的访问时间。那么,您的源代码和构建目录位于内部 Ubuntu 还是外部 【参考方案1】:

您是否在每次构建项目时都重新构建 OpenCV 库?如果您将库添加为外部项目,在某些情况下可能会无意中发生这种情况。 OpenCV 只能作为目标构建一次,然后使用target_link_libraries 链接到您的可执行目标。

您还可以为线程数设置-j 标志,请参阅https://cmake.org/cmake/help/v3.12/manual/cmake.1.html#build-tool-mode。

如果没有看到你的 CMakeLists.txt 文件,很难说更多。

【讨论】:

我一直在使用 -j 标志,但感谢您的建议。我刚刚用 CMakeList.txt 文件更新了我的问题;有什么不寻常的地方吗? 也许是个愚蠢的问题但是src/*.cpp,你的src文件只包含任何外部源文件,因为它们都会被构建。 是的,src/*.cpp 只是我的源文件【参考方案2】:

使用 make -j x x = 核心数 示例:

make -j 8

【讨论】:

感谢 Luis 的建议,不过我已经使用了 -j 标志【参考方案3】:

尝试使用Meson Build System 和ninja

【讨论】:

我们还不知道 cmake 是否导致了这个问题。 OP没有给出任何细节来确定这一点。无论如何,现在建议切换构建系统还为时过早。

以上是关于如何在 WSL2 上使用 OpenCV 加快 C++ 项目的构建速度? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何加快openCV中的颜色聚类?

如何从 Docker 容器内部访问在 WSL2 上运行的服务?

如何在 Windows 上运行多个 WSL2 实例?

多个图像上的 C++ OpenCV 线性代数?

如何在 WSL2 上设置工作 X11 转发 [关闭]

在 Windows 10 Home 上使用 WSL2 上的 Docker Desktop 时,如何更改 docker 映像的位置?