使用 GLAD 的多个 dll 上的 GLAD 初始化

问题描述 投票:0回答:1

目前我正在使用glfw和glad制作一个简单的3D空间。我的项目管理方法是将其分成较小的项目,例如:

  • 核心
  • 渲染器
  • 场景
  • 窗户
  • 外部图形库

ExternalGraphicsLibs有glfw、glad和glm目录,其源代码直接来自github(我只制作了一个cmakelists文件,使其成为该项目中的.dll)。 RendererScene都使用glad功能(它们看不到GLFW功能),而Window只能看到GLFW(没有GLAD可见性)。

我面临的问题是RendererScene都需要glad初始化,如果我只在渲染器中初始化glad,场景看不到它,所以我也需要在那里重新初始化它。在我看来,这不是最好的方法,因为两个库都有两个不同的函数指针指向glad,它们基本上会做同样的事情。

你们知道这个问题有什么解决办法吗?如何解决这个问题,或者只是将其保留在每个使用 happy 的 dll 都有自己的初始化的地方?

我的ExternalGraphicalLibs cmake:

cmake_minimum_required(VERSION 3.24.0)
project(ExternalGraphicsLibs)

set(CMAKE_BUILD_PARALLEL_LEVEL)
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# Find and configure OpenGL
find_package(OpenGL REQUIRED)

# GLFW options
set(GLFW_BUILD_DOCS OFF CACHE BOOL "Disable GLFW docs" FORCE)
set(GLFW_BUILD_TESTS OFF CACHE BOOL "Disable GLFW tests" FORCE)
set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "Disable GLFW examples" FORCE)
set(GLFW_INSTALL OFF CACHE BOOL "Disable GLFW install" FORCE)

# Add GLFW source code
add_subdirectory(glfw)

# Add GLAD source code
add_library(${PROJECT_NAME} 
    STATIC 
        ${CMAKE_CURRENT_SOURCE_DIR}/glad/src/gl.c
)

target_include_directories(${PROJECT_NAME} 
    PUBLIC
        glfw/include
        glad/include
        glm/
        ${OPENGL_INCLUDE_DIRS}
)

target_link_libraries(${PROJECT_NAME} 
    PUBLIC
        glfw
        ${OPENGL_LIBRARIES}
)
c++ opengl rendering glfw glad
1个回答
0
投票

通过将您的ExternalGraphicsLibs设置为STATIC,每个链接到它的库都有效地拥有自己的GLAD副本。将其设置为 SHARED,这样所有客户都可以共享 GLAD 状态。

看起来

gladLoadGL
gladLoadGLLoader
也没有被设计为多次调用。您应该将其包装在一个简单的函数中,以防止多次调用。或者您可以使用
std::call_once
,它也可以为您处理任何并发呼叫。

© www.soinside.com 2019 - 2024. All rights reserved.