VS单解决方案多项目多DLL多exe管理
2017-07-05 14:38
337 查看
说明
假设:一个解决方案包括一个Game项目目录:下有多个生成可执行程序的game项目,一个引擎Engine项目,引擎依赖多个其他库Pro1,Pro2,Pro3,每个库生成单独的dll,引擎本身也生成dll,Game项目生成exe可执行程序.准备
文件目录组织
解决方案文件名SolutionTest,其下新建文件夹Binaries\Win64:所有的dll,lib,exe将生成到这个文件下
Engine:所有的dll项目将创建在这个目录下
Temp:所有的中间文件将保存到这个目录下
Source:所有dlll项目的源程序将保存到这个目录下
Game:所有游戏项目将在这个目录下,其源代码也在其下,执行程序生成到Birnaries\Win64下.
Media:所有公共资源文件放到这个目录下.项目自身资源需要自行管理,建议放到Media下相应文件夹下.
发行项目的方法:
将Media必须资源拷贝到Binaries下,并将Binaries改名为相应发行项目名,即可.
创建解决方案
打开vs,新建项目,选择:模版->其他项目类型->vs解决方案->空白解决方案,命名为SolutionTest.在解决方案资源管理器中,右击解决方案,添加三个解决方案文件夹,分别命名为:Engine,Third,Game
创建多个子项目
在Engine解决方案目录新建Engine项目,放置到Engine文件目录下选择vc++->空项目
在Third解决方案目录新建Pro1,Pro2,Pro3项目,放置到Engine文件目录下,项目模版也是空项目
在Game解决方案目录新建Sampler项目,放置到Game文件目录下
选择vc++->空项目,去掉预编译头选项
最终解决方案列表如下:
配置各个解决方案
通用配置Engine:
选中Engine项目右键属性
配置常规中的:
输出目录为:$(SolutionDir)Binaries\Win64\
中间目录为:$(SolutionDir)Temp\$(ProjectName)\
目标文件名为:$(ProjectName)_d
目标文件扩展名为:.dll
配置类型:动态库(.dll)
这一步Pro1,Pro2,Pro3与Engine完全相同,如法炮制.
Sampler稍有不同的是:
编写测试代码
Pro1项目加入一个Pro1类,有AddInt方法Pro2项目加入一个Pro2类,有SubInt方法
Pro3项目加入一个Pro3类,有MulInt方法
Engine加入Engine类,有AddAndSub方法,可以看到这个库引用了Pro1,Pro2库
Sampler有主函数,使用Engine,Muler的方法,引用了Engine,Pro3库.
Pro1:
通过类向导,在Source\Pro1\目录下添加类:Pro1
代码如下
//Pro1.h #pragmaonce class__declspec(dllexport) Pro1 { public: Pro1(); ~Pro1(); intAddInt(int arg1, int arg2); };
问题:为什么class后有__declspec(dllexport)
这是为了让VS同时生成项目的dll和lib文件
//Pro1.cpp略,其方法AddInt就一行代码:return
arg1+arg2;
Pro2:
通过类向导,在Source\Pro2\目录下添加类:Pro2
如法炮制
不同的是自定义方法SubInt实现arg1-arg2
Pro3:
通过类向导,在Source\Pro3\目录下添加类:Pro3
如法炮制
不同的是自定义方法SubInt实现arg1*arg2
Engine项目:
添加类:Engine存储到Source\Engine文件目录下
//Engine.h #pragmaonce #include"../Pro1/Pro1.h" #include"../Pro2/Pro2.h" #include"../Pro3/Pro3.h" #pragmacomment(lib,"Pro1_d.lib") #pragmacomment(lib,"Pro2_d.lib") #pragmacomment(lib,"Pro3_d.lib") class__declspec(dllexport) Engine { public: Engine(); ~Engine(); //(arg1+arg2)- arg3 intAddAndSub(int arg1, int arg2,int arg3); //(arg1+arg2)* arg3 intAddAndMul(int arg1, int arg2, int arg3); };
//Engine.cpp #include"Engine.h" Engine::Engine() { } Engine::~Engine() { } intEngine::AddAndSub(int arg1, int arg2, int arg3) { Pro1p1; Pro2p2; returnp2.SubInt(p1.AddInt(arg1, arg2),arg3); } intEngine::AddAndMul(int arg1, int arg2, int arg3) { Pro1p1; Pro3p3; returnp3.MulInt(p1.AddInt(arg1,arg2),arg3); }
Sampler项目添加文件main.cpp到Sampler项目目录下(不是Source目录)
代码:
#include<Engine.h> #include<iostream> #pragmacomment(lib,"Engine_d.lib") intmain() { Engineeng; std::cout<< "2+3-4 = " << eng.AddAndSub(2, 3, -4) <<std::endl; std::cout<< "(2+3)*4 = " << eng.AddAndMul(2, 3, 4) <<std::endl; return0; }
额外的配置
Engine项目
配置VC++目录:包含目录,加入Pro1,Pro2,Pro3源代码目录
配置库目录为$(SolutionDir)Binaries\
同理配置Sampler项目的包含目录与库目录,包含Engine源代码,库目录相同
测试
一次编译Pro1,Pro2,Pro3,Engine,Sampler项目并运行Sampler生成的可执行程序
结果如下:
现在可以修改各个子项目而不用迁移发动全身了.
相关文章推荐
- vs2017 活动解决方案或项目由选择的源代码管理插件以外的插件管理
- 打开VS解决方案,提示“未能找到与此解决方案关联的源代码管理提供程序。项目将被视为不受源代码管理。”
- VS2012 发布管理项目时报错解决方案
- vs2013 活动解决方案或项目由选择的源代码管理插件以外的插件管理
- 项目管理手记(13)-ERP的中看不中用VS中用不中
- 朗志轻量级项目管理解决方案-RBAC角色权限模块介绍
- VS.NET新建项目失败(附解决方案)
- (摘)vs.net web项目使用visual source safe进行源代码管理
- 移动项目开发笔记(管理不同解决方案下的DLL文件相互引用之心得体会)
- 微软项目管理解决方案解析
- [转]Web项目下NHibernate的Session管理的解决方案
- (摘)vs.net web项目使用visual source safe进行源代码管理
- VS.NET2003多项目解决方案的一个BUG
- vs.net web项目使用visual source safe进行源代码管理
- VS2005解决方案下无法添加项目的解决方法
- 朗志轻量级项目管理解决方案截图
- 解决方案看起来是受源代码管理,但无法找到它的帮定信息.保存解决方案的源代码管理设置的MSSCCPRJ.SCC文件或其他项可能己被删除.由于无法自动恢复这些缺少的信息,缺少帮定的项目将被视为不受源代码管理.
- 项目统一开发管理解决方案思路[项目组成员同时做很多项目的解决思路探讨]
- vs.net web项目使用visual source safe进行源代码管理(转)
- “初涉软件项目管理的彷徨”解决方案 (转)