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

目录结构

工程目录组织规范
目录结构标题
  • <<项目名称>> :使用英文命名,而且最好放英文目录下,这样会避免很多问题,当在代码中处理路径时最好考虑中文路径,特别是用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)

配置示例如下所示:

工程目录组织规范
中间目录配置
  • 版权声明:文章来源于网络采集,版权归原创者所有,均已注明来源,如未注明可能来源未知,如有侵权请联系管理员删除。

发表回复

后才能评论