首页
社区
课程
招聘
[原创]Visual Studio 2012远程编译Linux/Solaris..语法提示 自动补全
发表于: 2013-8-19 16:35 14900

[原创]Visual Studio 2012远程编译Linux/Solaris..语法提示 自动补全

2013-8-19 16:35
14900

sysprogs有个叫VirtualKd的工具想必大家一定很熟悉,这个工具可以很方便地双机调试。
另外一款VisualGdb可以让VisualStudio远程编译linux程序,而且还支持调试功能。非常强大,可惜只有30天试用。目前只支持应用层编译、调试,不支持内核模块的编译调试。

试用了一下VisualGdb,很好用,自动通过ssh连接到目标机,下载缓存include。编译的时候通过ssh上传到目标机,然后make,返回的信息可以被VS识别错误行、警告行。

而我的需求是开发Linux/Solaris内核模块,VisualGdb的调试功能就用不到了,远程编译固然好用,但是为了这个功能花€80我觉得不值。看起来这个功能很简单的样子,就自己尝试实现了一下。

查看VisualGdb生成的工程属性发现VisualGdb配置了生成、重新生成、清理解决方案的命令行。

也就会说在编译的时候运行了它的工具,然后这个工具上传文件、执行make、处理返回结果。途径是ssh。

百度找到了个libssh2的库,这是个ssh客户端。可以ssh连接远程服务器。使用其中的sftp进行远程文件读写。使用channel进行shell操作。

另外VisualStudio是不识别gcc编译的错误信息的,要做到双击编译错误自动跳转到错误行,这个功能很实用。

http://www.codeproject.com/Articles/370890/GCCFilter-A-script-for-compiling-with-GCC-in-Visua

上面这个文章讲了如何使VisualStudio支持Gcc编译输出。作者就是大名鼎鼎的sysprogs的创始人之一Ivan Shcherbakov

简单来说就是Gcc编译输出如下:
文件名/全路径:行:列: error
文件名/全路径:行: error

VisualStudio可以识别的格式如下:
全路径(行,列): error
全路径(行): error

Ivan使用了perl的正则表达式进行查找和格式化输出。

我这里使用了AoGo的正则表达式库,这个库很小只有几KB,汇编编写,不论是效率还是用法均超越其他各种正牌xxoo正则库,非常好用。

我使用如下两个表达式对gcc的某一行信息进行正则匹配。

CHAR szExpRowCol[] = "^{?+[:]}:{[0-9]+}:{[0-9]+}:{?+<#0A>}";    //表达式: 文件名:行号:列号:错误信息
CHAR szExpRow[] = "^{?+[:]}:{[0-9]+}:{?+<#0A>}";                //表达式: 文件名:行号:错误信息

AoGo的这个版本的正则库$符号匹配的行尾是\r,会有一些小问题,我使用#0A代替了。
这样就匹配到了文件名、行号、列号(可能没有),错误信息(包含换行符)
然后使用{1}({2},{3}):{4}这种方式重新格式化一下就可以让VisualStudio识别了。
详细的过程请看源代码。

各个模块写好之后拼装起来
工作流程就是:上传工程文件、make、重新格式化gcc输出信息。

很简单吧。

把目标机的include文件复制到本地,然后在VS工程属性里配置一下。这样就可以让VisualAssistX支持函数提示和自动补全功能了。

附件有RemoteBuild的bin和src。
还有2个VS2012的模板,分别是Linux内核模块和Solaris内核模块。

用法:
0.配置环境变量或者把RemoteBuild放在system32
1.用模板建立工程
2.配置工程属性NMake:预处理器定义、包含搜索路径(见附件图)
3.配置工程文件build.ini里面的:目标机IP,端口,用户名,密码,工作目录
4.生成

看帖下附件不回MJJ。。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 5
支持
分享
最新回复 (20)
雪    币: 69
活跃值: (41)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
沙发~~~~
2013-8-19 16:38
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
3
支持楼主~~~
2013-8-19 16:40
0
雪    币: 12
活跃值: (605)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
支持一把mengxp.
2013-8-19 16:41
0
雪    币: 46
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
JJ FLY!! 顶MENGXP!
2013-8-19 16:47
0
雪    币: 360
活跃值: (127)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
6
支持!!!
2013-8-19 17:08
0
雪    币: 73
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
下载了就要回,~~
2013-8-19 17:46
0
雪    币: 219
活跃值: (793)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
8
支持 XP
2013-8-19 17:47
0
雪    币: 325
活跃值: (97)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
9
VS2012,对GCC的语法是不全面兼容的。 还是推荐用NetBeans这些。
2013-8-20 16:23
0
雪    币: 304
活跃值: (507)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
10
在我这里VS只作为IDE,所以没有什么不兼容。只是写代码,要什么兼容性~
2013-8-20 20:06
0
雪    币: 275
活跃值: (51)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
11
不太明白 好像很强大的样子
2013-8-21 15:38
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
very good!
2013-8-21 22:57
0
雪    币: 338
活跃值: (103)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
13
不错  发现自己开发环境太弱了。。。。。。。。。。
2013-8-22 09:42
0
雪    币: 174
活跃值: (620)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
我觉得这个方式不是很好啊?
我设想的是学习VS的编译模式:
1.直接将GCC全面移植到VS中,当一种编译方式,就像Intel C++编译器一样,选一下就可以了,注意是面开发机上编译,而不是楼上的在远程编译,性能区别很大

2.利用VS的远程调度技术,如果在Linux机器实现远程调度就好了
这样,全程都是VS,效率更高,关键是用起来很爽,现在用vs2012做arm平板开发,那种感觉,真不是linux下能体验到的,可以说真是传说中的甩N条街
2013-8-22 10:06
0
雪    币: 55
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
好像挺牛B,make学习.
2013-8-30 12:56
0
雪    币: 382
活跃值: (362)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
16
很早之前就用这货调linux/android内核+应用了。很强大。不过美中不足的是中文系统下界面有问题,还有就是调android的时候没单步一下。这货都会列freame导致单步很卡。。给作者提了几个bug,同事买的时候还给打了个5折。反破解做的很好。
2013-8-30 13:22
0
雪    币: 7325
活跃值: (3803)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
17
好帖,先留个名
2013-8-30 14:22
0
雪    币: 211
活跃值: (58)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
现在还不开发linux,Mark备用
2013-8-30 16:15
0
雪    币: 11
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
学长,仰慕已久,终于在看雪上见到您了  xiyou万岁
2013-9-28 22:24
0
雪    币: 230
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
不明觉厉!
2013-12-25 14:25
0
雪    币: 132
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
不明觉厉!
2013-12-31 23:53
0
游客
登录 | 注册 方可回帖
返回
//