c ++静态,动态库 - 分析UE4构建系统

时间:2015-12-19 13:21:46

标签: c++ linker unreal-engine4

TL:DR; UE4中的静态/动态库和数据共享。

所以所有的库都是静态的或动态的,但没有"混合"溶液

详细说明:

我浏览UE4源代码,发现他们正在使用模块化系统。因此,他们构建库(静态或动态,基于IS_MONOLITHIC定义),并根据构建配置文件(如Core.Build.cs)进行链接。

让我们阅读" OpenGLDrv"模块的构建文件。它取决于核心和引擎(等等)库,所以我猜它们与OpenGLDrv库相关联。

检查Launch模块,在Build文件中,他们为D3DXX和OpenGLDrv库设置了动态模块依赖关系。

这就是我的问题:

  • 如果它们是动态加载的模块,则它们必须是动态库(Windows中的dll)。如果不是真的,他们是静态链接的吗?
  • 如果静态链接,他们如何处理全局/静态数据共享? Launch和OpenGLDrv都依赖于Core模块,该模块与两个库静态链接。
  • 如果OpenGLDrv是动态库而启动和核心不是,则数据共享问题仍然存在。

更具体地说

我试图实施类似的系统。我正在使用visual studio,而我目前的目标平台仅限Windows(但我是以独立于平台的方式编写代码)。

目前我有以下5个模块:

  • 核心:它有真正的核心内容,如数学类,记录器,misc和模块管理器。
  • 模块:"可实施"的基类模块:InputDevice,GraphicsDevice等。核心与此相关联。
  • OGLDevice :这应该是一个动态库。它实现了特定于OpenGL的GraphicsDevice。核心和模块都链接到它。
  • 引擎:这是"主要图书馆"哪一个。 Core和Modules都链接到此库。它应该动态加载OGLDevice。
  • 应用:主要的可执行文件。引擎与此相关联。

这是我自己在Paint中绘制的非常酷的图像: The best design-image ever

如果所有4个库都是静态的,则依赖项没有任何问题。但是,这样OGLDevice不是动态加载的库,因为它链接到Engine。也许设备本身没有实例化,但仍然链接到项目。

如果Core,Modules和Engine库是静态的,但OGLDevice是动态的,则会出现数据共享问题。首先,核心是#34;加载"引擎(因为它与它静态链接)但是当引擎加载OGLDevice库时,它也会加载"它自己的核心。所以每个静态和全局都是重复的。

如果所有模块都是动态的,我想它应该可行。有没有办法混合静态和动态库的东西?

或者UE4如何做到这一点?

0 个答案:

没有答案