Извлечение нескольких реализаций в статические библиотеки - PullRequest
2 голосов
/ 19 декабря 2011

У меня есть (все еще) небольшой игровой движок на 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 Ответ

1 голос
/ 20 декабря 2011

Позвольте мне ответить на мой собственный вопрос.Я провел еще несколько исследований по этой теме и обнаружил, что статические библиотеки требуют, чтобы используемые заголовки были в основном проекте, в то время как реализации .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
                ...

Все исходные коды теперь создаются правильно, и я могу выбрать, с какой библиотекой компилятор должен связываться (или, конечно, с обоими). ​​

Спасибо за просмотр.

...