【问题标题】:How can I speed up build of c++ project using OpenCV on WSL2? [closed]如何在 WSL2 上使用 OpenCV 加快 C++ 项目的构建速度? [关闭]
【发布时间】: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 还是外部

标签: c++ opencv cmake


【解决方案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 Systemninja

【讨论】:

  • 我们还不知道 cmake 是否导致了这个问题。 OP没有给出任何细节来确定这一点。无论如何,现在建议切换构建系统还为时过早。
猜你喜欢
  • 2011-07-04
  • 1970-01-01
  • 2011-01-15
  • 1970-01-01
  • 1970-01-01
  • 2019-03-26
  • 2014-09-09
  • 1970-01-01
  • 2019-06-11
相关资源
最近更新 更多