前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >用 powershell 脚本 .ps1 写一个自动化的「编译->链接->运行C++文件」脚本

用 powershell 脚本 .ps1 写一个自动化的「编译->链接->运行C++文件」脚本

作者头像
Piper蛋窝
发布2021-03-24 17:45:02
发布2021-03-24 17:45:02
1.3K00
代码可运行
举报
文章被收录于专栏:Piper蛋窝Piper蛋窝
运行总次数:0
代码可运行

注:感谢您能点开本文,本文是我 debug 后的随笔,可能没那么容易读懂(现在是0:44...实在太累了...写不动具体场景了)。待到我熬过这段...将写出更多深入浅出的好文与您分享!

我这人有个毛病:一定要用 VS Code 写代码,确切地说,一定要用我自己的 VS code ,自己配好的键盘映射、自己的插件。

近来从实习岗位回学校,想要在自己的 win 10 上跑通实验代码,何谈容易。最主要的问题在于:我需要用到外部依赖 gecode ,对于 win 10 ,经验告诉我,从源码编译来安装并不是一个好的选择,从官网下载 .msi 安装包再配合 VC++ 是明智之举。我没什么意见,但是...我不想用 VS(VC++的编辑器),只想用 VS Code 。这就需要额外学习一点东西了:

  • VC++ 内的微软编译器 MSVC cl.exe 使用?
  • 自动完成「编译->链接->运行C++文件」流程?

首先我们可以得到 cl.exe 编译链接的方法,由 gecode说明书MPG[1]

代码语言:javascript
代码运行次数:0
复制
cl /DNDEBUG /EHsc /MD /wd4355 -I "D:\Program Files\gecode\include" \
        -c ./$filename.obj -Tp ./$filename.cpp
cl /DNDEBUG /EHsc /MD /wd4355 -I "D:\Program Files\gecode\include" \
        -Fe ./$filename.obj /link /LIBPATH:"D:\Program Files\gecode\lib"

如上,先编译为 .obj ,再链接,链接时别忘了告诉编译器 *.lib 都放在哪里。

我们不可能每次运行程序时,都向命令行输入这么长一串命令,于是我想到:

  • 把这个过程写在 makefile 里?(win 10 上 make 命令报错,遂放弃)
  • 把 gecode 的 includePath 和 libPath 放到 环境变量 includelib 里?(污染系统环境,且我们不可能每应用一个外部依赖,就修改一次系统环境,遂放弃)
  • 用 shell 来集成这些命令

于是就有了 test.ps1

代码语言:javascript
代码运行次数:0
复制
$filename = main
if ($args.Count -eq 1)
{
    $filename = $args[0]
}
else
{
    Write-Output "There must be one filename as arg!"
    exit
}

if (Test-Path ./$filename.obj)
{
    Remove-Item ./$filename.obj
}

if (Test-Path ./$filename.exe)
{
    Remove-Item ./$filename.exe
}

try
{
    Write-Output "compile..."
    cl /DNDEBUG /EHsc /MD /wd4355 -I "D:\Program Files\gecode\include" `
        -c ./$filename.obj -Tp ./$filename.cpp

    Write-Output "link..."
    cl /DNDEBUG /EHsc /MD /wd4355 -I "D:\Program Files\gecode\include" `
        -Fe ./$filename.obj /link /LIBPATH:"D:\Program Files\gecode\lib"

    Write-Output "run..."
    sudo ./$filename.exe
}
catch
{
    # 目前 try 捕获不到编译器的异常
    # issue: need help
    Write-Warning "Error: $_"
    exit
}

第一次写 ps 脚本,还望大佬多多指教。有几点需要注意:

  • ` 是用来换行的
  • 执行编译出的可执行文件需要用 sudo ,这很迷,我做了一点笔记[2]

如何使用?

当我有一个脚本 abc.cpp ,我只需要在命令行输入

代码语言:javascript
代码运行次数:0
复制
test abc

就可以自动 编译->链接->运行C++文件abc.cpp了!

编译前:

代码语言:javascript
代码运行次数:0
复制
│  abc.cpp
│  test.ps1

编译后:

代码语言:javascript
代码运行次数:0
复制
│  abc.cpp
│  abc.exe
│  abc.obj
│  test.ps1

参考资料

[1]

gecode说明书MPG: https://github.com/Gecode/MPG

[2]

笔记: https://piperliu.blog.csdn.net/article/details/114858671

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Piper蛋窝 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档