说明
假设:一个解决方案包括一个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生成的可执行程序
结果如下:
现在可以修改各个子项目而不用迁移发动全身了.