cmake: 使用jom实现msvc工程并发编译提高速度(-j)

介绍了如何利用jom工具提高MSVC编译速度。通过设置环境变量或指定jom路径,可以使用CMake生成jom格式的Makefile,并通过-j参数指定并发任务数实现高效编译。

msvc提供的nmake并没有并发编译功能(类似gcc make的-j参数指定并发编译的任务数),
而第三方工具jom(http://wiki.qt.io/Jom)解决了这个问题,jom可以像gcc 的make一样 通过-j参数指定并发编译,让cpu全速运行,可以大大提高编译速度,节省大型项目的编译时间。
cmake也支持jom编译,cmake 有一个名为"NMake Makefiles JOM"的CMake Generator就是用来生成jom格式的Makefile.下面以编译gflags为例说明jom编译的使用方法
#获取jom
访问jom官网(http://wiki.qt.io/Jom)下载jom 的二进制压缩包解压到本地的文件夹,jom就算是安装好了(jom很小,只有5个文件)

#cmake
将jom所在文件夹加到PATH环境变量

set path=d:\caffe-static\tools\jom-1.1.2;%path%

生成jom的Makefile

gflags_source_folder>cmake  -G "NMake Makefiles JOM"  . 

如果不把jom的路径加到%PATH%中,也可以如下通过 定义CMAKE_MAKE_PROGRAM变量来指定jom.exe的位置

gflags_source_folder>cmake  -G "NMake Makefiles JOM" -DCMAKE_MAKE_PROGRAM=d:\jom-1.1.2\jom.exe .

然后就可以如下使用jom编译了, -j参数用于指定并发任务数

gflags_source_folder>jom -j 8

#补记:

其实MSVC提供的MSBuild.exe和devenv.exe,也提供了并发编译功能,只是参数调用不同,稍显复杂。
以下是MSBuild的maxcpucount参数说明:

/maxcpucount[:n]  指定用于生成的最大
          并发进程数。如果未使用开关,则使用的默认值
          为 1。如果使用开关时不带值,
          MSBuild 将最多使用计算机上的
          处理器数。(缩写: /m[:n])

devenv.exe 默认就是并发编译的

<think>好的,我现在需要解决用户的问题:如何使用CMake为OpenCV生成适用于MSVC工程并完成编译。用户之前到了在编译时遇到的CMake错误,特别是关于CUDA和生成器表达式的问题。我需要结合用户供的引用内容,尤其是引用[1]中的错误信息,以及用户之前的对话历史,给出一个清晰的步骤指南。 首先,用户之前的问题涉及到使用MSVC编译Qt、LibTorch和OpenCV,现在他们希望单独了解如何为OpenCV生成MSVC工程编译。用户可能遇到了在配置CMake时出现的CUDA相关错误,这可能是因为在生成工程时某些选项设置不正确,或者路径问题导致的。 我需要先回顾用户供的引用。引用[1]显示了一个CMake错误,指出在FindCUDA.cmake文件中,使用了不正确的生成器表达式,可能与QT_TESTCASE_BUILDDIR有关。这可能是因为在OpenCV的CMake配置中,某些CUDA相关的选项被错误地启用了,或者CMake版本与OpenCV版本不兼容。引用[3]和[4]到了在Windows下使用CMake和VS编译OpenCV及contrib模块的步骤,这应该作为参考。 接下来,我需要整理出正确的步骤,确保用户能够顺利生成MSVC工程编译OpenCV。需要注意以下几点: 1. **环境准备**:确保安装了正确版本的CMake、Visual Studio,以及OpenCV源码和contrib模块(如果需要的话)。 2. **配置CMake**:正确设置源码路径、生成路径、选项如BUILD_opencv_world,OPENCV_EXTRA_MODULES_PATH(如果使用contrib),以及禁用不必要的模块(比如CUDA,如果用户不需要或者遇到问题)。 3. **处理用户遇到的错误**:引用[1]中的错误可能涉及到CUDA配置问题,可能需要禁用CUDA或调整生成器表达式。或者,可能需要更新CMake或OpenCV版本,或者修改CMake参数以避免冲突。 4. **生成和编译**:使用CMake生成解决方案后,用Visual Studio进行编译,注意选择正确的配置(Release/Debug),并处理可能的依赖问题。 需要确保步骤清晰,避免用户再次遇到类似的CMake错误。可能需要建议用户禁用CUDA支持,特别是在他们不需要的情况下,或者检查他们的CMake配置是否正确。此外,用户可能需要确保路径中没有空格或特殊字符,避免因此导致的问题。 另外,用户之前的配置中到了Qt,可能需要醒用户在编译OpenCV时是否需要与Qt集成,如果需要,可能需要启用相关的选项,比如WITH_QT,并确保Qt的路径正确。不过用户当前的问题集中在生成MSVC工程,可能暂时不需要Qt支持,但需要根据实际情况调整。 最后,验证编译后的库是否正确安装,并配置环境变量,确保后续项目可以链接到这些库。同时,供常见问题的解决方法,如CUDA错误、路径问题、编译失败等。</think>### 使用CMake为OpenCV生成MSVC工程编译的完整指南 以下是针对Windows平台下使用CMake生成MSVC工程编译OpenCV的详细步骤,结合您遇到的CMake CUDA错误问题,供优化配置方案。 --- #### **1. 环境准备** - **安装工具链**: - **Visual Studio 2019/2022**:安装时勾选“C++桌面开发”组件(确保MSVC编译器可用)。 - **CMake 3.26+**:从[CMake官网](https://cmake.org/download/)下载最新版本。 - **OpenCV源码**:下载官方源码(如[opencv-4.8.1](https://opencv.org/releases/))和[opencv_contrib](https://github.com/opencv/opencv_contrib)(可选)。 - **目录结构建议**: ``` D:/opencv/ ├── sources/ # OpenCV源码 ├── contrib/ # opencv_contrib源码(若需要) └── build/ # 编译输出目录 ``` --- #### **2. CMake配置(关键步骤)** 1. **打开CMake GUI**,填写路径: - **Source Code**: `D:/opencv/sources` - **Build Directory**: `D:/opencv/build` 2. **点击`Configure`**,选择生成器为`Visual Studio 2019/2022`和平台(如`x64`)。 3. **配置核心选项**: ```plaintext # 基础配置 BUILD_opencv_world = ON # 合并为单个库(简化链接) BUILD_EXAMPLES = OFF # 减少编译时间 BUILD_PERF_TESTS = OFF BUILD_TESTS = OFF # 若需要扩展模块(如opencv_contrib) OPENCV_EXTRA_MODULES_PATH = D:/opencv/contrib/modules # 禁用可能引发问题的模块 WITH_CUDA = OFF # 解决CUDA生成器表达式错误[^1] WITH_IPP = OFF # 避免Intel库依赖冲突 ``` 4. **二次配置**:点击`Generate`生成工程文件。 --- #### **3. 编译OpenCV** 1. **打开生成的工程**:进入`D:/opencv/build`,双击`OpenCV.sln`。 2. **选择编译模式**:在Visual Studio顶部选择`Release`或`Debug`。 3. **编译库**: - 右键`ALL_BUILD` → `生成`(等待10-60分钟,取决于硬件)。 - 右键`INSTALL` → `生成`,将库安装到`D:/opencv/build/install`。 --- #### **4. 环境验证** 1. **配置环境变量**:将以下路径加入系统`PATH`: ``` D:/opencv/build/install/x64/vc16/bin # OpenCV的DLL路径 ``` 2. **测试代码**: ```cpp #include <opencv2/opencv.hpp> int main() { cv::Mat image = cv::imread("test.jpg"); if (!image.empty()) { cv::imshow("Image", image); cv::waitKey(0); } return 0; } ``` --- #### **5. 常见问题解决** - **CUDA生成器表达式错误** 若需启用CUDA,需确保: 1. 安装CUDA Toolkit 11.x+并配置环境变量。 2. 更新CMake至最新版本(避免旧版本与OpenCV的兼容问题)[^1]。 3. 使用以下替代配置: ```cmake WITH_CUDA = ON CUDA_ARCH_BIN = "8.6" # 根据GPU算力修改(如RTX 3060为8.6) CUDA_FAST_MATH = ON ``` - **opencv_contrib模块编译失败** 检查`OPENCV_EXTRA_MODULES_PATH`路径是否正确,并禁用有问题的模块: ```cmake OPENCV_ENABLE_NONFREE = OFF # 避免专利算法冲突 BUILD_opencv_xfeatures2d = OFF # 若xfeatures2d模块报错 ``` - **MSVC链接错误(LNK2019)** 确保编译模式(Release/Debug)与项目配置一致,并检查库路径是否包含在`附加库目录`中[^2]。 --- #### **6. 自动化脚本(可选)** 使用批处理脚本加速配置: ```bat @echo off set OPENCV_SOURCE=D:/opencv/sources set OPENCV_BUILD=D:/opencv/build set CONTRIB_PATH=D:/opencv/contrib/modules cmake -S %OPENCV_SOURCE% -B %OPENCV_BUILD% ^ -G "Visual Studio 17 2022" -A x64 ^ -DBUILD_opencv_world=ON ^ -DOPENCV_EXTRA_MODULES_PATH=%CONTRIB_PATH% ^ -DWITH_CUDA=OFF cmake --build %OPENCV_BUILD% --config Release --target INSTALL ``` --- ### 相关问题 1. 如何为OpenCV启用CUDA加速并解决CMake生成器错误? 2. 使用CMake编译OpenCV时如何优化编译速度? 3. 如何将编译好的OpenCV库集成到Qt项目中?
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

10km

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值