VS2013使用VS2008的联合编译进行工程编译

公司开发C++是使用vs2008,编译的时候使用联合编译IncreBuild进行编译;在vs2008中使用visual assistx,如果代码太长,滚动的时候偶尔会出现页面乱码,而且有时候虚函数互相定位也有问题,没有vs2013使用方便,但是在vs2013中又不能直接编译,所有寻思做个插件解决编译问题;

因为工程文件都是使用vc9生成的,所有使用vs2013打开时,会自动进行工程升级,升级完成后,vc9和vs2013的工程会同时存在,如果想在vs2013中调用vs2008的编译器进行编译,可以通过联合编译调用vs2008的工程文件编译;

1、创建vs2013的插件工程;

2、在connect.cs中,修改函数OnConnection,在末尾增加代码,用来增加菜单

 1 try
 2                 {
 3                     //Add a command to the Commands collection:
 4                     Command command = commands.AddNamedCommand2(_addInInstance, "MyAddin1", "MyAddin1", "Executes the command for MyAddin1", true, 59, ref contextGUIDS, (int)vsCommandStatus.vsCommandStatusSupported+(int)vsCommandStatus.vsCommandStatusEnabled, (int)vsCommandStyle.vsCommandStylePictAndText, vsCommandControlType.vsCommandControlTypeButton);
 5
 6                     //Add a control for the command to the tools menu:
 7                     if((command != null) && (toolsPopup != null))
 8                     {
 9                         command.AddControl(toolsPopup.CommandBar, 1);
10                     }
11                     CommandBar slnCommandBar = GetCommandBarByName("Project");
12                     // Add a new command
13                     AddNamedCommand2(slnCommandBar, "Build",
14                       "Build By IncreBuild", "Build By IncreBuild", false, 0, 1);
15                 }
16                 catch(System.ArgumentException)
17                 {
18                     //If we are here, then the exception is probably because a command with that name
19                     //  already exists. If so there is no need to recreate the command and we can
20                     //  safely ignore the exception.
21                 }

3、修改函数QueryStatus,用来显示菜单

 1 public void QueryStatus(string commandName, vsCommandStatusTextWanted neededText, ref vsCommandStatus status, ref object commandText)
 2         {
 3             if(neededText == vsCommandStatusTextWanted.vsCommandStatusTextWantedNone)
 4             {
 5                 if(commandName == "MyAddin1.Connect.MyAddin1")
 6                 {
 7                     status = (vsCommandStatus)vsCommandStatus.vsCommandStatusSupported|vsCommandStatus.vsCommandStatusEnabled;
 8                     return;
 9                 }
10                 if (commandName == "MyAddin1.Connect.Build")
11                 {
12                     status = (vsCommandStatus)vsCommandStatus.vsCommandStatusSupported | vsCommandStatus.vsCommandStatusEnabled;
13                     return;
14                 }
15             }
16         }

4、执行的时候,根据获得到的工程文件,解析路径,然后编写一个使用联合编译的脚本就行了

 1 public void Exec(string commandName, vsCommandExecOption executeOption, ref object varIn, ref object varOut, ref bool handled)
 2         {
 3             handled = false;
 4             if(executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault)
 5             {
 6                 if(commandName == "MyAddin1.Connect.MyAddin1")
 7                 {
 8                     handled = true;
 9                     return;
10                 }
11                 else if (commandName == "MyAddin1.Connect.Build")
12                 {
13                     try
14                     {
15                         SelectedItems items = _applicationObject.SelectedItems;
16                         System.Array projs = items.DTE.ActiveSolutionProjects as System.Array;
17                         string projectname = null;
18                         foreach (Project item in projs)
19                         {
20                             projectname = item.UniqueName;
21                         }
22                         if (null != projectname)
23                         {
24                             BuildProject(projectname);
25                         }
26                     }
27                     catch(Exception e)
28                     {
29
30                     }
31                     handled = true;
32                     return;
33                 }
34             }
35         }
36
37         private void BuildProject(string Proj)
38         {
39             if(!File.Exists(Proj))
40             {
41                 return;
42             }
43             if(!Proj.Contains("vcxproj"))
44             {
45                 return;
46             }
47             string oldprj = Proj.Replace("vcxproj", "vcproj");
48             if(!File.Exists(oldprj))
49             {
50                 return;
51             }
52              XmlDocument xdoc = new XmlDocument();
53             xdoc.Load(oldprj);
54             XmlElement root=xdoc.SelectSingleNode("VisualStudioProject") as XmlElement;
55             if(root.GetAttribute("ProjectType") != "Visual C++" ||
56                 root.GetAttribute("Version") != "9.00")
57             {
58                 return;
59             }
60             string projname=root.GetAttribute("Name");
61             List<string> lstconfig = new List<string>();
62             XmlNodeList lstconfignode = xdoc.SelectNodes("//VisualStudioProject/Configurations/Configuration");
63             foreach(XmlElement item in lstconfignode)
64             {
65                 lstconfig.Add(item.GetAttribute("Name"));
66             }
67             if(lstconfig.Count<=0)
68             {
69                 return;
70             }
71
72             DirectoryInfo dir = Directory.GetParent(oldprj);
73             string batfile = dir.ToString() +"\\"+ projname + ".bat";
74             StreamWriter sw = new StreamWriter(batfile);
75             sw.Write("buildconsole ");
76             sw.Write(oldprj);
77             sw.Write(" /prj=\"");
78             sw.Write(projname);
79             sw.Write("\" /build /OpenMonitor /cfg=\"");
80             sw.Write(lstconfig[0]);
81             sw.Write("\"\r\n");
82             sw.Flush();
83             sw.Close();
84
85
86
87             System.Threading.Thread t = new System.Threading.Thread(new ThreadStart(() => {
88                 ProcessStartInfo info = new ProcessStartInfo(batfile);
89                 info.CreateNoWindow = true;
90                 info.RedirectStandardOutput = false;
91                 info.RedirectStandardInput = false;
92                 info.UseShellExecute = true;
93                 System.Diagnostics.Process p = System.Diagnostics.Process.Start(info);
94                 p.WaitForExit();
95             }));
96             t.Start();
97
98
99         }
时间: 2024-09-29 08:25:37

VS2013使用VS2008的联合编译进行工程编译的相关文章

vs2008+cmake2.8+OpenCV2.8.4配置过程中OpenCV.sln重编译部分工程失败

解决方法来自此链接 http://www.tuicool.com/articles/qiQBb2N vs2008+cmake2.8+OpenCV2.8.4配置过程 1.解压opencv2.4.8 2. CMake2.8 生成VS2008版本的解决方案 3.OpenCV.sln重新编译,出现问题出现14个工程编译错误,几乎都提示缺少opencv_ocl248d.lib, 单独对工程进行opencv_ocl工程 进行生成操作,发现与opencl_kernels.hpp相关. 于是搜索得文章最上方连接

关于VC工程编译不过去这件事

刚开始接触VC的时候,很大一部分时间是在对付编译链接错误,因为经验不足的原因,这些编译链接总让人很沮丧.比如: 1.fatal error LNK1104: 无法打开文件“LIBC.lib”错误 这个错误是因为库冲突导致的,解决方法如下: 方法一: 用VSDNET2005重新编译某个工程的发生了链接错误 现在把这个解决过程分享一下. 错误如下:fatal error LNK1104: 无法打开文件“LIBC.lib” . 解决如下:项目->属性中->配置属性->链接器->输入-&g

图文介绍windows下实现编译ffmpeg工程的详细步骤

本文来自:http://www.cuplayer.com/player/PlayerCode/FFmpeg/2014/0706/1401.html 图文介绍windows下实现编译ffmpeg工程的详细步骤: 1.搭建 MinGW 的编译环境 下载yasm,地址:http://yasm.tortall.net/Download.html 改名为yasm.exe放到C:\WINDOWS\system32 或者 C:\MinGW\msys\1.0\bin文件夹下. 下载 mingw-get-inst

nixyx —— 一个小巧的项目工程/编译文件生成器(构建系统?)

恩..nixyx确实算不上是一个构建系统. 所谓构建系统,比如GNU的Autotools,那是一套很完整的构建体系,包括了程序的配置,编译和安装三大部分. 类似的软件还有:google的gyp.腾讯的Blade等.它们最大的好处在于,可以不考虑平台之间的差别,使用统一的配置文件和命令,做到跨平台部署. 它们往往还支持很多很高端的功能,比如集成自动测试,代码检查(Blade).. 可是我暂时不需要这些复杂的功能.我正在编写的nixy库是一个跨平台/编译器的C++库,它非常小,没必要使用大型的(或者

VS2013和VS2008项目的互通

VS2013和VS2008项目的互通,大家可能都查到了百度经验里面的一个帖子: http://jingyan.baidu.com/article/f54ae2fc3c3adc1e92b849de.html 这个帖子中介绍的是将.sln项目文件作如下修改: 修改文本中 Microsoft Visual Studio Solution File, Format Version 13.00 # Visual Studio 2013 修改为 Microsoft Visual Studio Solutio

用批处理编译*.sln工程

原文:用批处理编译*.sln工程 批处理是直接调用Microsoft Visual Studio 8\Common7\IDE\ 目录内的 devenv.exe ,它启动后就是IDE,提供的参数如下: 用法: devenv [solutionfile | projectfile | anyfile.ext] [switches] devenv 的第一个参数通常是一个解决方案文件或项目文件.如果您希望在编辑器中自动打开文件,也可以使用任何其他文件作为第一个参数.当您输入项目文件时,IDE会在项目文件

加快QT工程编译速度(还可给Qt for Android设置)

一.多核编译 环境:win10, Qt 5.4.1,编译器mingw32 项目: Qt for Android Qt Creator 在编译android项目时不支持预编译,默认cpu单核编译,工程稍大一点导致编译过程极其缓慢,影响效率. 不过Qt Creator自带了多核编译工具支持,只是没有默认开启,需要自己在项目中进行配置才能生效. 步骤如下[以本机和项目为例]: 1.查看是否已经安装了jom工具:C:\Qt\Qt5.4.1\Tools\QtCreator\bin\jom.exe 2.项目

xcode工程编译错误:No architectures to compile for

问题 开发环境:xcode6,iPhone6模拟器 xcode工程编译错误:No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386). 原因 导致这个错误的原因主要是CPU的编译架构引起的,Build Active Architecture Only属性设置为了YES(只编译当前模拟器指令集),当出现不兼容设备时就会出现错误. 解决 在工程Build Settings,

eclipse中多个工程编译到同一个目录下

1.点击link source  2.选择Java(ps:Java文件目录)或者resource(ps:配置文件目录)  3.最后结果,然后使用project中的clean进行编译,就可以把两个工程编译到一个目录下面了