您的位置:首页 > 编程语言 > C语言/C++

配置一个干净的VS C++工程目录结构

2014-01-27 02:07 746 查看
众所周知,VS的工程目录十分复杂,一堆ncb,project,filter,user等等乱七八糟的文件,与源码cpp/h等放在一起十分的恶心。

而且debug/release目录里又有十分多的obj,sbr,bsr等文件。

这里介绍个手工修改工程模版的方法,实现每次新建工程时,自动生成的目录结构十分的清晰

效果结构:

/解决方案名/工程名称/src/*                        // 只有cpp/c/h/hpp文件,很清晰

/解决方案名/工程名称/res/*                        // 什么ico,bmp,mainfest啊,都在这里

/解决方案名/工程名称/*                               // 工程配置文件,以及def/rc两个文件

/解决方案名/obj/工程名称/debug/*            // 一些不需要关心的临时文件

/解决方案名/obj/工程名称/release/*         // 一些不需要关心的临时文件

/解决方案名/out/                                          // 编译出来的exe,dll等,放一个目录里,包括同一个解决方案下的其他工程模块

===================

D:\dev\vs2003\Vc7\VCWizards\2052\common.js
第一处修改地方

查找GetTargetName (......)

在这行后面添加上

            var extName = strTarget.substring(strTarget.lastIndexOf('.')+1, strTarget.length).toLowerCase();
            if(strTarget.lastIndexOf('/') == -1 && strTarget.lastIndexOf('\\') == -1)
            {
                var filename = strTarget.toLowerCase();
                if( filename == "readme.txt" ) {
                    continue;
                } else if(  filename == "resource.h" ) {
                    // 必须与rc放同目录
                }
                else if(extName == "cpp" || extName == "c" || extName=="h" || extName == "hpp" || extName=="inl" || extName == "inc"  )  
                {
                    strTarget = "src/" + strTarget;
                }
                else if(extName == "def" || extName == "rc"  ) {
                    //rc文件必须得放目录下,因为一些模板文件指定了绝对路径,很蛋疼
                }
                else{
                    strTarget = "res/" + strTarget;
                }
            }


这样就实现了创建工程时目录自动分类了,不过在工程里添加新代码文件时还不是自动归类, 这方面暂时未解决,若哪天解决了我再编辑写这文章,现在只能在添加的时候,手工加入src/路径。

若对于头文件想自动归类到inc目录的话,请自行修改。

--

第二处修改地方

查找AddCommonConfig

在函数前面加一句

g_macroName_Configuration = null;
然后在var config = oProj.Object.Configurations("Debug"); 和 config = oProj.Object.Configurations("Release"); 后面分别加上以下内容
        if(g_macroName_Configuration == null){
            g_macroName_Configuration = config.IntermediateDirectory;  // 只取一次初始配置,防止在方案下第二个工程使用了第一个工程的配置
        }
         var macroName_Configuration = g_macroName_Configuration;
        //  VER <= VS2008 IS "$(ConfigurationName)\";
        //  VER >= VS2010 IS "$(Configuration)\"
        //  识别debug/release所用的宏名称,这里直接使用原先的内容,动态识别.
        //config.IntermediateDirectory = "$(SolutionDir)obj/$(ProjectName)/"+macroName_Configuration;
        //  存放obj到解决方案下
        config.IntermediateDirectory = "e:/tmp-dev/$(SolutionName)/$(ProjectName)/"+macroName_Configuration;
        // 也可以放在固定位置,这样工程目录就又更清晰了  
        config.OutputDirectory = "$(SolutionDir)out\\";  
        //  将exe,dll,pdb放在out目录。 

这个有两处,一个debug,一个release,分别修改下。

另外,由于我们debug/release都是放out目录里,所以需要设置成两个不同的最终exe名称。这里是增加个D表示是debug版本.

搜索 AddFilesToProject( ,在其try的第一行加入以下指令(其实这个就在刚才修改文件归类的前面就是了)

        function vs_add_debug_name() {
            var dbg_config = oProj.Object.Configurations("Debug");
            var rules = dbg_config.Rules;
            if(rules != null)  {
                var ob = rules.Item("ConfigurationGeneral");
                ob.SetPropertyValue( "TargetName", ob.GetUnevaluatedPropertyValue("TargetName") + "D" );
            }
            else  {
                function InsertDebugFileName(filepath) {
                    var dotpos = filepath.lastIndexOf('.');
                    if(dotpos > 0 ) {
                        filepath = filepath.substr(0, dotpos) + "D" + filepath.substr(dotpos);
                    }
                    return filepath;
                };
                var dbg_link = dbg_config.Tools("VCLinkerTool");
                if(dbg_link){
                    dbg_link.OutputFile = InsertDebugFileName(dbg_link.OutputFile);
                    dbg_link.ProgramDatabaseFile = InsertDebugFileName(dbg_link.ProgramDatabaseFile);
                }
                var dbg_lib = dbg_config.Tools("VCLibrarianTool");    
                if(dbg_lib){
                    dbg_lib.OutputFile = InsertDebugFileName(dbg_lib.OutputFile);
                }
            }
        };
        vs_add_debug_name();

        function insert_includes(dir){
            function insert_config_include(name, dir) {
                var config = oProj.Object.Configurations(name);
                var cl_tools = config.Tools("VCCLCompilerTool");
                if(cl_tools){
                    cl_tools.AdditionalIncludeDirectories = dir + ";" + cl_tools.AdditionalIncludeDirectories;
                }
                var res_tools = config.Tools("VCResourceCompilerTool");
                if(res_tools){
                    res_tools.AdditionalIncludeDirectories = dir + ";" + res_tools.AdditionalIncludeDirectories;
                }
            };
            insert_config_include("Debug", dir);
            insert_config_include("Release", dir);
        }
        insert_includes("res");
        insert_includes("src");
        insert_includes(".");

后面的insert_includes是解决rc路径的头文件问题。以及其他放在工程目录下的cpp/h对src的引用路径问题

over

本方法已经在vs2003/2008/2010中试验通过,但有部分向导创建的文件还是有部分遗留文件问题,但基本不多,可以自己手工移动下
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐