VS单解决方案多项目多DLL多exe管理

来源:互联网 发布:前台js调用天气插件 编辑:程序博客网 时间:2024/05/15 21:43

说明

假设:一个解决方案包括一个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.

pic1

在解决方案资源管理器中,右击解决方案,添加三个解决方案文件夹,分别命名为:Engine,Third,Game

 

创建多个子项目

Engine解决方案目录新建Engine项目,放置到Engine文件目录下

选择vc++->空项目

pic2

 

Third解决方案目录新建Pro1,Pro2,Pro3项目,放置到Engine文件目录下,项目模版也是空项目

 

Game解决方案目录新建Sampler项目,放置到Game文件目录下

选择vc++->空项目,去掉预编译头选项

 

最终解决方案列表如下:

pic3

 

配置各个解决方案

通用配置

Engine:

选中Engine项目右键属性

配置常规中的:

输出目录为:$(SolutionDir)Binaries\Win64\

中间目录为:$(SolutionDir)Temp\$(ProjectName)\

目标文件名为:$(ProjectName)_d

目标文件扩展名为:.dll

配置类型:动态库(.dll)

pic4

 

这一步Pro1,Pro2,Pro3Engine完全相同,如法炮制.

 

Sampler稍有不同的是:

pic5

 

 

 

编写测试代码

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#pragmaonceclass__declspec(dllexport) Pro1{public:Pro1();~Pro1(); intAddInt(int arg1, int arg2); };


问题:为什么class后有__declspec(dllexport) 

这是为了让VS同时生成项目的dlllib文件

//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)- arg3intAddAndSub(int arg1, int arg2,int arg3); //(arg1+arg2)* arg3intAddAndMul(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.cppSampler项目目录下(不是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\

pic6

 

同理配置Sampler项目的包含目录与库目录,包含Engine源代码,库目录相同

 

测试

一次编译Pro1,Pro2,Pro3,Engine,Sampler项目

 

并运行Sampler生成的可执行程序

 

结果如下:

pic7

 

 

现在可以修改各个子项目而不用迁移发动全身了.