Ninja使用Visual Studio(cl.exe)构建
Ninja基本步骤
Ninja的作用是加速构建,最初目的是替代make,现在Windows系统上也可以用,也就是用Ninja替代nmake或者MSBuild来生成target。
本人不做Chromium等大型程序构建,jenkins也没怎么用过。平时接触到用Ninja的地方只有一个:android ndk开发时,编一个arm android console application可执行程序时(或者编库)时用到。当然,这个可以丢给自动构建。
这次在caffe-builder的脚本中看到willyd调用的是Ninja,换成Visual Studio会提示报错,“和先前的Ninja不一致”。VS是集成开发环境,它的编译器是cl.exe。
网络上搜到的用cl.exe编译、用Ninja构建的例子,是Windows下编译clang源码中的 官方步骤 中给出的:
没错,只需要这几个步骤:
- 进入cmd,并且正确的设定需要用到的编译器(VS)环境,例如vs2015的就用vs2015的,以及注意x64还是x86等
- 确保CMakeLists.txt存在,编写正确
- 到build目录去调用cmake,指定generator为Ninja
- Ninja xxx
Ninja在VS2015下的问题和解决
基于上述步骤,尝试了VS2017下的调用:
cd /d d:/toy/rr
call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars64.bat" amd64
md build-vs2017
cd build-vs2017
cmake .. -G Ninja
ninja rr
同样的方式,调用VS2015,出现了幺蛾子:
cd /d d:/toy/rr
call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" amd64
md build-vs2015
cd build-vs2015
cmake .. -G Ninja
ninja rr
翻看D:\toy\rr\build-vs2015\CMakeFiles\CMakeError.log
,提示:
Determining if the C compiler works failed with the following output:
Change Dir: D:/toy/rr/build-vs2015/CMakeFiles/CMakeTmp
Run Build Command(s):D:/soft/ninja/ninja.exe cmTC_f3ef3 && [1/2] Building C object CMakeFiles\cmTC_f3ef3.dir\testCCompiler.c.obj
[2/2] Linking C executable cmTC_f3ef3.exe
FAILED: cmTC_f3ef3.exe
cmd.exe /C "cd . && D:\soft\cmake-3.15.3-win64-x64\bin\cmake.exe -E vs_link_exe --intdir=CMakeFiles\cmTC_f3ef3.dir --rc=rc --mt=CMAKE_MT-NOTFOUND --manifests -- C:\PROGRA~2\MICROS~3.0\VC\bin\amd64\link.exe /nologo CMakeFiles\cmTC_f3ef3.dir\testCCompiler.c.obj /out:cmTC_f3ef3.exe /implib:cmTC_f3ef3.lib /pdb:cmTC_f3ef3.pdb /version:0.0 /machine:x64 /debug /INCREMENTAL /subsystem:console kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib && cd ."
RC Pass 1: command "rc /fo CMakeFiles\cmTC_f3ef3.dir/manifest.res CMakeFiles\cmTC_f3ef3.dir/manifest.rc" failed (exit code 0) with the following output:
系统找不到指定的文件。
ninja: build stopped: subcommand failed.
其实这句话是说,rc这个命令找不到。
StackOverFlow上有网友提到和回答了这个问题:rc.exe no longer found in VS 2015 Command Prompt
很奇怪,为什么这位网友的报错提示那么的友好??
LINK : fatal error LNK1158: cannot run 'rc.exe' [D:\dev\cmaketest\build\CMakeFiles\3.8.1\CompilerIdC\CompilerIdC.vcxproj]
如果早些看出是rc.exe命令不存在,或许早就找到这篇回答,而不是用"visual studio 2015 ninja broken"这样的关键字做低效检索。
问题的原因是:VS2015 update3安装的时候,如果没有勾选“Windows和Web开发->通用Windows应用开发工具->Tools(1.4.1)和Windows 10 SDK(10.0.14393)”,则不会安装rc.exe到C:\Program Files (x86)\Windows Kits\10\bin\x64\rc.exe
,而这就导致Ninja调用cl.exe的时候失败。
解决办法:修复一下,安装"Tools(1.4.1)和Windows 10 SDK"即可:
修复后,编译输出截图:
Ninja命令行参数
详细的Ninja参数可以翻看在线文档:https://ninja-build.org/manual.html
个人觉得最有必要的一条是,ninja -t targets
,查看有哪些targets。因为是Windows下的cmd操作,没有Ubuntu下的bash的自动补全,没法用Tab补全,所以,这个命令需要记住。
Ninja错误的调用了gcc
我在Windows下也想用gcc/g++,倒不是开发大型程序,而是写很简短的单个文件时用来验证方便一些。安装的是TDM-GCC,会添加d:\soft\TDM-GCC-64\bin
路径到系统PATH中最前面:
这就导致一个问题:即使调用了vcvarsall.bat来设定VS的环境,CMake调用的却是gcc:
解决办法:其实在前面windows下编译clang的例子中已经给出了,需要设定CC和CXX环境变量的值,实际上熟悉CMake的都知道,CMake会读取CC和CXX环境变量,以及CMAKE_C_COMPILER
和CMAKE_CXX_COMPILER
变量的值,从而使用非默认的C/C++编译器。正确设定后输出是对的:
Ninja使用Visual Studio(cl.exe)构建的更多相关文章
- visual studio cl -d1reportSingleClassLayout查看内存f分布
C:\Users\Administrator\Desktop\cppsrc>cl -d1reportSingleClassLayoutTeacher virtual.cpp 用于 x86 的 M ...
- 使用Visual Studio 2013 从头构建Web表单
在这篇文章中,我将采取VS 2013中特定的模板,也就是没有身份验证的Web表单模板,并说明如何构建这个项目从头开始.在本教程的最后,你会最终有一个模板,内容几乎是一样的使用Web表单模板没有认证(文 ...
- 使用 Visual Studio 对exe文件进行数字签名
使用"VS2013 开发人员命令提示"运行签名工具.转到要签名的文件目录运行命令: signtool sign /a 要签名的程序.exe signtool 的相关命令 Usage ...
- 使用Visual studio查看exe或DLL文件的依赖项
事先准备:只要 Visual Studio 任何版本即可. 点击开始 -> 程序 -> Visual Studio对应的版本,打开Visual Studio Tools -> 选择 ...
- visual studio调试exe程序
标题:How to debug and profile any EXE with Visual Studio 文章:https://devblogs.microsoft.com/visualstudi ...
- Nodejs in Visual Studio Code 13.构建单页应用Scrat示例挖一挖
1.开始 Scrat作者说要搞个很碉堡的示例,果然就搞出来了,如果要学习并使用Scrat,可以从官方示例开始,简直太方便了. 2.Scrat示例 目录 component_modules : 公共组件 ...
- Nodejs in Visual Studio Code 12.构建单页应用Scrat实践
1.开始 随着前端工程化深入研究,前端工程师现在碉堡了,甚至搞了个自己的前端网站http://div.io/需要邀请码才能注册,不过里面的技术确实牛.距离顶级的前端架构,目前博主应该是far away ...
- (英文版)使用Visual Studio 2015 编写 MASM 汇编程序!
原文地址:http://kipirvine.com/asm/gettingStartedVS2015/index.htm#CreatingProject Getting Started with MA ...
- 微软 Visual Studio 14 CTP2 发布
对于在微软阵营下进行工作的团队来说,拥有最新版本的 Visual Studio 是提高效率最佳的选择,没有之一. 在本文中,我们就上个月发布的 Visual Studio "14" ...
随机推荐
- 基于CAS实现无锁结构
杨乾成 2017310500302 一.题目要求 基于CAS(Compare and Swap)实现一个无锁结构,可考虑queue,stack,hashmap,freelist等. 能够支持多个线程同 ...
- 2016年蓝桥别A组模拟训练
1. 网友年龄 某君新认识一网友. 当问及年龄时,他的网友说: “我的年龄是个2位数,我比儿子大27岁, 如果把我的年龄的两位数字交换位置,刚好就是我儿子的年龄” 请你计算:网友的年龄一共有多少种可能 ...
- [LeetCode] 888. Fair Candy Swap 公平糖果交换
Alice and Bob have candy bars of different sizes: A[i] is the size of the i-th bar of candy that Ali ...
- 不同种类的ICP算法
摘自<三维点云数据拼接中ICP及其改进算法综述>
- 【MySQL】Mariadb字符集
Mariadb字符集 如果不设置字符集,可以查看mariadb的字符集的默认设置是latin1. 如下命令,查看Mariadb的默认配置: [root@oradb ~]# /usr/local/mys ...
- vue条件语句、循环语句、计算属性、侦听器监听属性
因为 v-if 和v-for是一个指令,所以必须将它添加到一个元素上.但是如果想切换多个元素呢?此时可以把一个 <template> 元素当做不可见的包裹元素,并在上面使用 v-if.最终 ...
- Spring-Boot-操作-Redis,三种方案全解析!
在 Redis 出现之前,我们的缓存框架各种各样,有了 Redis ,缓存方案基本上都统一了,关于 Redis,松哥之前有一个系列教程,尚不了解 Redis 的小伙伴可以参考这个教程: Redis 教 ...
- Window应急响应(六):NesMiner挖矿病毒
0x00 前言 作为一个运维工程师,而非一个专业的病毒分析工程师,遇到了比较复杂的病毒怎么办?别怕,虽然对二进制不熟,但是依靠系统运维的经验,我们可以用自己的方式来解决它. 0x01 感染现象 1.向 ...
- Caused by: java.lang.ClassCastException: org.springframework.web.SpringServletContainerInitializer cannot be cast to javax.servlet.ServletContainerInitializer。。。。。检查一下servlet-api是否冲突了?
原因:jar包发生冲突.在我的pom.xml文件中 <dependency> <groupId>javax.servlet</groupId> ...
- TransactionScope 使用的注意事项
前两天为了给代码做一些事务封装,写了个小Demo,用TransactionScope代码块实现. 第一条更新成功后第二条刻意抛出异常,结果发现第一条总执行成功,这不符合预期,于是开始一步步跟踪调试. ...