cmake: 使用jom实现msvc工程并发编译提高速度(-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 默认就是并发编译的

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏自动化测试实战

获取响应头与发送头

3756
来自专栏mathor

Cookie读写操作

 浏览器与WEB服务器之间是使用HTTP协议进行通信的,当某个用户发出页面请求时,WEB服务器只是简单的进行响应,然后就关闭与该用户的连接。因此当一个请求发送到...

924
来自专栏精讲JAVA

使用 JITWatch 查看 JVM 的 JIT 编译代码

我们知道Java代码通过编译器编译成字节码,一般是class文件,有JVM的各个类加载器加载后,根据JVM的启动配置可以进行解释执行和编译执行,编译执行是由JI...

1022
来自专栏AhDung

【Tip】如何让引用的dll随附的xml注释文档、pdb调试库等文件不出现在项目输出目录中

其中xml是同名dll的注释文档,pdb是调试库。我们最终应该只想要exe和dll,除了手工删,我知道的有两招,可以让项目生成后,xml和pdb不会出现:

633
来自专栏电光石火

java之log4j的配置

log4j是用来记录日志的。 软件的运行过程离不开日志.日志主要用来记录系统运行过程中的一些重要的操作信息,便于监视系统运行情况,帮助用户提前发现和避...

2048
来自专栏张善友的专栏

DataDirectory是什么?

asp.net 2.0有一个特殊目录app_data,通常Sql server 2005 express数据文件就放在这个目录,相应的数据库连接串就是: con...

1899
来自专栏编程

怎么解决koa写server发布的噩梦

前言 ? . 以前在用koa写server的时候,发布简直是噩梦。需要将src里面的全部文件都覆盖掉,config配置文件也要覆盖,稍有不慎就会线上报各种各样的...

2298
来自专栏运维小白

4.10/4.11/4.12 lvm讲

LVM讲解 lvm的优缺点 优势:很方便的扩容和缩容磁盘空间 局限性:,磁盘发生损坏,不易于恢复 ? lvm准备工作 fdisk /dev/sdb n 创建3...

1638
来自专栏Sorrower的专栏

内核必须懂(一): 用系统调用打印Hello, world!

533
来自专栏非著名程序员

Android 开发中如何动态加载 so 库文件

我想对于静态加载 so 库文件,大家都已经很熟悉了,这里就不多说了。在 Android 开发中调用动态库文件(*.so)都是通过 jni 的方式,而静态加载往往...

19310

扫码关注云+社区