将多个实现提取到静态库中

Extract multiple implementations into static libraries

本文关键字:静态 提取 实现      更新时间:2023-10-16

我有一个用Visual Studio构建的c++小游戏引擎。游戏引擎支持DirectX和OpenGL,但这并不重要。重要的是,我有一些抽象基类的特定实现(例如,DXKernel和OGLKernel作为Kernel类的子类)。因此,DXKernel和OGLKernel类有一个带有一些特定于平台代码的公共接口。内核类确实有一些自己的实现,所以它不是一个纯接口,这些方法应该由实现继承。

现在,根据我的理解,最好从主项目中取出特定的实现,并创建静态库来链接主项目,这取决于我正在编译的平台。如果我为OS X编译,我只想包含OpenGL实现。如果我正在为Windows编译,我希望同时包含DirectX和OpenGL实现。

Visual Studio布局现在看起来像这样:

Solution
    Project
        Header files
            Core
                DX
                    DXKernel.h    <-- DirectX implementation of abstract methods
                    ...
                OGL
                    OGLKernel.h   <-- OpenGL implementation of abstract methods
                    ...
                Kernel.h          <-- abstract class(es)
                ...
            ...
        Source files
            Core
                DX
                    DXKernel.cpp
                    ...
                OGL
                    OGLKernel.cpp
                    ...
                Kernel.cpp
                ...
            ...

如果我在Visual Studio中创建了一个新的静态库项目,并将特定的文件复制到新的库中,我如何让库项目找到通用的头文件(例如Kernel.h)?我应该将主项目的头文件复制到库中(这会在头文件更新时产生问题)?我应该更改库项目的包含路径吗?

这种设置似乎在主项目和库之间创建了某种循环依赖关系,据我所知,情况不应该是这样的。

我希望你能帮助我。

让我来回答我自己的问题。我对这个主题做了更多的研究,发现静态库要求使用的头文件在主项目中,而这些头文件的.cpp实现在静态库中。

因此,项目的源代码现在看起来像这样:

Solution
    Main Project
        Header files
            Core
                DX
                    DXKernel.h    <-- DirectX header
                    ...
                OGL
                    OGLKernel.h   <-- OpenGL header
                    ...
                Kernel.h          <-- abstract class
                ...
            ...
        Source files
            Core
                Kernel.cpp
                ...
            ...
    Static library project (DirectX)
        Source files
            Core
                DXKernel.cpp     <-- DirectX implementation
                ...
    Static library project (OpenGL)
        Source files
            Core
                OGLKernel.cpp    <-- OpenGL implementation
                ...

所有的源代码现在都正确构建,我可以选择编译器应该链接哪个库(当然也可以两者都链接)。

感谢收看