程序员踩坑记录

vscode 自动调用mingw编译CPP文件

2019-08-14  本文已影响0人  云中声

开始以为挺简单的但是碰到了点麻烦,主要还是js本身异步执行任务不容易保证任务顺序的问题,主要难点是promise的使用。代码如下,存在些问题,项目目录下不能有子文件夹,脚本必须放在项目文件夹下。

我主要说一下我碰到的难点,
promise怎么用?
promise构造的时候构造函数是一个带resolve和reject两个参数的函数,在你的函数中调用能够切换promise对象的状态。

编译的时候必须先生成.o才能链接,因此使用promise.all()等待传入的promise对象全都切换到resolve状态才能进行链接。

所以在编译执行shell命令的时候,需要设定好回调函数,等到任务完成之后,resolve()这样就能保证一定的任务顺序

var process=require('child_process');//进程模块,提供调用shell脚本的能力
var fs=require('fs');//文件模块
var path=require('path');//路径模块



var dirname=__dirname;
var targetfile=[];
var files=[];
fs.readdir(__dirname,function(err,files){
    for(var i=0;i<files.length;i++){
        var result=files[i].match("((.cpp)|(.c))$");
        if(result!=null){
            targetfile.push(files[i].substring(0,result.index));
        }
    }
    //生成汇编命令
    var cmds=[];
    var promises=[]
    for(var i=0;i<targetfile.length;i++){
        cmds.push("g++ -c "+targetfile[i]+".cpp");
    }
    for(var i=0;i<cmds.length;i++){
        promises.push(new Promise(function(resolve,reject){
            process.exec(cmds[i],function(error,stdout,stderr){
                if(error){
                    reject();
                }else{
                    resolve();
                }
            })
        }));
    }
    Promise.all(promises).then(()=>{
        var cmd="g++ "
        for(var i=0;i<targetfile.length;i++)
            cmd=cmd+targetfile[i]+".o ";
        cmd=cmd+"-o main"
        process.exec(cmd,function(error,stdout,stderr){
            console.log("compile finish");
        })
    });
});




上一篇 下一篇

猜你喜欢

热点阅读