如何在 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++ 项目的构建速度? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Docker 容器内部访问在 WSL2 上运行的服务?
在 Windows 10 Home 上使用 WSL2 上的 Docker Desktop 时,如何更改 docker 映像的位置?