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

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

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

现在,据我了解,最好从主项目中取出具体实现,并创建静态库以链接主项目,具体取决于我正在编译的平台。所以,如果我正在为 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 中创建一个新的静态库项目,并将特定文件复制到新库中,我如何才能让库项目找到公共(public)头文件(例如 Kernel.h)?我是否应该将主项目的头文件复制到库中(这会在更新头文件时产生问题)?我应该更改库项目的包含路径吗?

虽然这种设置似乎在主项目和库之间创建了某种循环依赖关系,但据我所知,情况并非如此。

希望你能帮帮我。

最佳答案

让我回答我自己的问题。我对该主题进行了更多研究,发现静态库要求使用的 header 位于主项目中,而这些 header 的 .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
                ...

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

感谢收看。

关于c++ - 将多个实现提取到静态库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8559272/

相关文章:

c++ - 将 int 转换为 wchar_t 的正确方法是什么?

c++ - 处理 char ** argv

visual-studio - 如何在 Visual Studio 中自定义代码的文本编辑器或颜色标记部分?

gcc - 在 Windows 中静态链接 GTK+ 库

c++ - 延迟第三方库中静态变量的初始化

c++ - 从 std::vector 创建/填充 std::set 的 STL 方式

c++ - 以类型安全的方式将指针转换为指针

visual-studio-2010 - XMPP 客户端库 gloox - 链接器找不到符号

c++ - 选择要在 Visual C++ 2010 中使用的主要函数

xcode - 为什么Xcode不为静态库生成dSYM