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

时间:2011-12-19 09:24:36

标签: c++ visual-studio-2010 static-libraries

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

现在,根据我的理解,最好从主项目中取出具体的实现,并创建静态库来链接主项目,具体取决于我正在编译的平台。所以,如果我正在为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)?我应该将主项目的头文件复制到库中(这会在标题更新时产生问题)吗?我应该更改库项目的包含路径吗?

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

我希望你能帮助我。

1 个答案:

答案 0 :(得分:1)

让我回答我自己的问题。我对该主题做了一些更多的研究,发现静态库要求使用的头文件在主项目中,而这些头文件的.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
                ...

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

感谢收看。