array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 工程目录组织规范 - 爱码网

前面几天将整个项目的工程项目目录组织了一下,今天就发放一下在我对软件工程目录组织的一些看法。好的工程目录可以提高项目之间的共享,提供开发效率,而且当别人看你项目时会一目了然,哪个文件是干嘛的很清楚。总结如下:

目录结构

工程目录组织规范
目录结构标题
  • <<项目名称>> :使用英文命名,而且最好放英文目录下,这样会避免很多问题,当在代码中处理路径时最好考虑中文路径,特别是用C++开发时,因为我们根本不知道用户会把软件安装在什么路径下;
  • bin:存放二进制文件,即exe和dll;
  • lib:存放导入库,即项目中用到的其他库,或者本项目产生的lib;
  • include:存放头文件,比如有些公共模块的头文件;
  • <<project_group>>:C++ project文件组,一般跟项目同名,也可以是模块组名;
  • common | 3rd_party:公共模块文件夹组;
  • pcbuild | cmake:解决方案配置文件夹,pcbuild目录用于放置vc工程,cmake目录用于放置cmake文件。

bin目录

bin目录存放编译好的exe和dll,以及项目运行所需的其它配置、初始化和资源等其它文件。bin的内部结构如下:

工程目录组织规范
bin目录

 

Debug和Release存放32位编译结果,如dll、pdb和exe等。

Debug_x64和Release_x64存放64位编译结果。不需64位版本则不用建立此目录。

Setting等其它文件按项目需要设置,一般对应于发布目录中的结构。

include目录

include目录存放模块头文件,每个模块都占用一个单独文件夹,当然存放的都是需要导出的类,如果不需要导出则不需要。实际上这里面也可以存放第三方库的头文件如:python、boost等。织带来的好处是,项目文件夹把“include”目录加入包含搜索路径中,在代码中即可以一致的方式include模块头文件,例如:

#include <python/python.h>

#include <boost/algorithm>

工程目录

每个vc工程对应一个独立文件夹,存放于类别文件夹之下:

工程目录组织规范
工程目录

 工程内部文件结构如下:

工程目录组织规范
工程内部结构

其中:

  • resources存放资源文件,包括图片,qss等
  • 工程配置存放于工程根目录:
  1. 如果是vc工程,配置文件为*.vcxproj
  2. 如果是qt工程,配置文件*.pri
  • 源文件,包括工程内部的头文件、实现文件和qt的.ui文件等。
  1. 推荐存放于src目录
  2. 如果源文件数目较少,也可以直接存放于根目录;
  3. 如果源文件太多需要分类,也可以建立子文件夹分类

无论采用以上哪种方式,工程内部头文件和cpp最好存放在同一个目录,而且最好有分类,如:workbench,panel等,这样在vs中也建立对应的分类,如:

工程目录组织规范
工程文件分类

 工程配置规范

项目配置中的路径一律要求使用相对路径,输出目录都要相对解决方案所在目录定义,以方便工程文件夹集成到其它解决方案中。所有配置项要尽可能的采用VS提供的宏来保持一致性,常用的宏有:

$(Configuration)

配置名称,比如Debug和Release

$(SolutionName)

解决方案名称

$(ProjectName) 

工程名称

$(TargetName)  

目标文件名

$(OutDir)      

目标文件输出目录

 目标文件输出目录和目标文件名

Debug和Release的输出目录相同,统一为:

//解决方案上一层目录中的bin目录下对应的配置文件夹(DebugRelease

$(SolutionDir)..\bin\$(Configuration)

//如果是64位版本,则配置为:

$(SolutionDir)..\bin\$(Configuration)_x64

Release的目标文件名保持项目名不变,Debug需要在项目名后加_d, 如下图所示:

工程目录组织规范
目标文件输出目录配置

 lib的输出目录

lib文件,需要生成到跟dll不同的目录,因此要修改链接器属性,Debug和Release配置相同,统一为:

//解决方案上一层目录中的lib目录

$(SolutionDir)..\lib\$(TargetName).lib

//如果是64位版本,则配置为:

$(SolutionDir)..\lib_x64\$(TargetName).lib

工程目录组织规范
lib的输出目录

 预处理器(导出库宏定义)

dll工程的配置,都需要导出接口,定义在global头文件中,例如mw_evaluator_config.h中的导出接口定义如下:

#ifdef MW_EVALUATOR_EXPORTS

# define MW_EVALUATOR_API _declspec(dllexport)

#else

# define MW_EVALUATOR_API _declspec(dllimport)

#endif

本项目中需要在预处理器中定义“MW_EVALUATOR_EXPORTS”宏,Debug和Release都要定义,如下图所示:

工程目录组织规范
 预处理器

 附加包含目录(include目录)

配置附加包含目录时,要加入依赖的模块目录所在的父文件夹,这样可以使得项目中以一致的方式include头文件。

模块较少的情况下,模块目录都直接放置在include目录中。

此时,将include路径加入附加包含目录,代码中引入头文件时以各模块名开头:

#include <boost/bind.hpp>

#include <google/protobuf/service.h>

模块较多时,模块目录可以存放在二级分类目录中。

注意:在代码中include工程外的模块头文件时,必须用尖括号“<>”,而非引号“""”。

Debug和Release的附加包含目录的配置保持一致,示例如下:

工程目录组织规范
 附加包含目录

 附加库目录(lib所在目录)

lib文件统一放置到根目录下的lib目录中,Debug后用_d和Release区别。因此,需要在项目中统一把lib目录加入附加库目录,Debug和Release配置相同:

工程目录组织规范
 附加库目录

 附加依赖项(导入的lib名称)

附加依赖项按需填写,注意Debug版本的库的正确名称是否有“_d”后缀:

工程目录组织规范
 附加依赖项

 

中间目录

中间目录用于存放编译过程产生的中间文件,比如obj文件、log文件和缓存文件等。为方便统一清理,建议中间目录设置到解决方案目录下的配置文件夹:

工程目录组织规范
中间目录

采用$(Configuration)宏,可以使Debug和Release统一:

$(SolutionDir)\$(Configuration)\

配置示例如下所示:

工程目录组织规范
中间目录配置

相关文章: