工程目录组织规范
前面几天将整个项目的工程项目目录组织了一下,今天就发放一下在我对软件工程目录组织的一些看法。好的工程目录可以提高项目之间的共享,提供开发效率,而且当别人看你项目时会一目了然,哪个文件是干嘛的很清楚。总结如下:
目录结构
- <<项目名称>> :使用英文命名,而且最好放英文目录下,这样会避免很多问题,当在代码中处理路径时最好考虑中文路径,特别是用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的内部结构如下:
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等
- 工程配置存放于工程根目录:
- 如果是vc工程,配置文件为*.vcxproj
- 如果是qt工程,配置文件*.pri
- 源文件,包括工程内部的头文件、实现文件和qt的.ui文件等。
- 推荐存放于src目录
- 如果源文件数目较少,也可以直接存放于根目录;
- 如果源文件太多需要分类,也可以建立子文件夹分类
无论采用以上哪种方式,工程内部头文件和cpp最好存放在同一个目录,而且最好有分类,如:workbench,panel等,这样在vs中也建立对应的分类,如:
工程配置规范
项目配置中的路径一律要求使用相对路径,输出目录都要相对解决方案所在目录定义,以方便工程文件夹集成到其它解决方案中。所有配置项要尽可能的采用VS提供的宏来保持一致性,常用的宏有:
$(Configuration) |
配置名称,比如Debug和Release |
$(SolutionName) |
解决方案名称 |
$(ProjectName) |
工程名称 |
$(TargetName) |
目标文件名 |
$(OutDir) |
目标文件输出目录 |
目标文件输出目录和目标文件名
Debug和Release的输出目录相同,统一为:
//解决方案上一层目录中的bin目录下对应的配置文件夹(Debug或Release) $(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 |
预处理器(导出库宏定义)
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)\ |
配置示例如下所示: