您的位置:首页 > 其它

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生成的可执行程序
 
结果如下:



 

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

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐