2021年3月18日 星期四

把 GLAD 編譯成 dll

因 LearnOpenGL 採用 GLAD 來抓取 OpenGL API,所以也研究了一下,GLAD 的好處是可以明確指定你開發程式所要支援的 OpenGL 版本,在初始化時可以檢查顯示卡是否能支援。

GLAD 可到 https://glad.dav1d.de 下載,但拿到的會是原始檔,因 GLAD 只是把 OpenGL API 的函數位址抓出來存放到程式可觸及的記憶體空間中,若採用把 glad.c 和你的專案一起編譯,則主程式(exe) 和各用到 OpenGL API 的 dll 都得把 glad.c 一起編譯,並各別呼叫 gladLoadGL() 做初始化,既浪費空問(因得各別保存 OpenGL API 的函數位址)又沒人性(因得各別 gladLoadGL() 初始化)。

我想最完美的做法是把 GLAD 編譯成 dll,這樣 GLAD 的 OpenGL API 函數位址就放在這個 dll 獨立空間中,而 gladLoadGL() 只要由主程式呼叫一次就可以了。

很幸運的發現 GLAD 有支援這樣編譯的功能,只要用以下 CMake 的 CMakeLists.txt:

cmake_minimum_required(VERSION 3.11)
PROJECT(glad)

add_compile_options(-std=c++11)
SET(CMAKE_DEBUG_POSTFIX _d)
SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -D_DEBUG")

SET(SRC_LIST "src/glad.c")
INCLUDE_DIRECTORIES("include")

#GLAD 對 dll 的支援
ADD_DEFINITIONS(-DGLAD_GLAPI_EXPORT -DGLAD_GLAPI_EXPORT_BUILD )

ADD_LIBRARY(glad SHARED ${SRC_LIST})

SET_TARGET_PROPERTIES(glad
    PROPERTIES
    VERSION     3.3.0
    SOVERSION   3
    )


INSTALL(TARGETS glad
        RUNTIME DESTINATION lib
        LIBRARY DESTINATION lib
        ARCHIVE DESTINATION lib
        )


INSTALL(DIRECTORY include/ DESTINATION include)

在 win 用 vs2019 可以成功編譯出 glad.dll 及伴隨的 glad.lib(用 debug 模式編譯為 glad_d.dll 及 glad_d.lib),在 CMakeLists.txt 中的 GLAD_GLAPI_EXPORT 及 GLAD_GLAPI_EXPORT_BUILD 是 GLAD 對 dll 的支援,要編譯 GLAD 須兩者都指定,而使用 GLAD 的程式只可以單獨指定 GLAD_GLAPI_EXPORT。

下載完整範例 glad3.3_dll_src.7z

範例抓的 GLAD 是 OpenGL 3.3 版,如下圖



這個 CMakeLists.txt 應可適用所有版本,試試看吧









沒有留言:

張貼留言