zoukankan      html  css  js  c++  java
  • 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源码中的 官方步骤 中给出的:

    没错,只需要这几个步骤:

    1. 进入cmd,并且正确的设定需要用到的编译器(VS)环境,例如vs2015的就用vs2015的,以及注意x64还是x86等
    2. 确保CMakeLists.txt存在,编写正确
    3. 到build目录去调用cmake,指定generator为Ninja
    4. Ninja xxx

    Ninja在VS2015下的问题和解决

    基于上述步骤,尝试了VS2017下的调用:

    cd /d d:/toy/rr
    call "C:Program Files (x86)Microsoft Visual Studio2017CommunityVCAuxiliaryBuildvcvars64.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.0VCvcvarsall.bat" amd64
    md build-vs2015
    cd build-vs2015
    cmake .. -G Ninja
    ninja rr
    

    翻看D: oy ruild-vs2015CMakeFilesCMakeError.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 CMakeFilescmTC_f3ef3.dir	estCCompiler.c.obj
    
    [2/2] Linking C executable cmTC_f3ef3.exe
    
    FAILED: cmTC_f3ef3.exe 
    
    cmd.exe /C "cd . && D:softcmake-3.15.3-win64-x64incmake.exe -E vs_link_exe --intdir=CMakeFilescmTC_f3ef3.dir --rc=rc --mt=CMAKE_MT-NOTFOUND --manifests  -- C:PROGRA~2MICROS~3.0VCinamd64link.exe /nologo CMakeFilescmTC_f3ef3.dir	estCCompiler.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 CMakeFilescmTC_f3ef3.dir/manifest.res CMakeFilescmTC_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:devcmaketestuildCMakeFiles3.8.1CompilerIdCCompilerIdC.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 Kits10inx64 c.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:softTDM-GCC-64in路径到系统PATH中最前面:

    这就导致一个问题:即使调用了vcvarsall.bat来设定VS的环境,CMake调用的却是gcc:

    解决办法:其实在前面windows下编译clang的例子中已经给出了,需要设定CC和CXX环境变量的值,实际上熟悉CMake的都知道,CMake会读取CC和CXX环境变量,以及CMAKE_C_COMPILERCMAKE_CXX_COMPILER变量的值,从而使用非默认的C/C++编译器。正确设定后输出是对的:

  • 相关阅读:
    过滤器
    [自定义][分享]渲染后编程环境字体媲美Mac系统
    discuz!NT论坛系统邮件设置的一个问题
    [mssql] 【求教】论两张无关联的表作为查询样本的纠结模糊查询
    一个广告位的三种状态的判断
    Lucene:(一)建立索引文件:2。建立索引文件(五)Lucene中Term的概念
    Lucene:(一)建立索引文件:2。建立索引文件(三)DocumentWriter类
    Lucene:(一)建立索引文件:2。建立索引文件(六)Lucene中Term的索引
    Lucene:(一)建立索引文件:2。建立索引文件(四)Field信息的建立
    欧几里得&扩展欧几里得算法
  • 原文地址:https://www.cnblogs.com/zjutzz/p/11669304.html
Copyright © 2011-2022 走看看