如何使用CMake同时构建外部库与自研跨平台OpenGL应用?
解决跨平台CMake构建OpenGL依赖库(无系统权限)的方案
这问题我太熟了——当你没有系统权限安装依赖,又要做跨平台OpenGL项目时,CMake的FetchContent模块(CMake 3.11+支持,现在主流版本都满足)就是完美的解决方案。它能把glfw、glbinding、glm这些依赖的源码拉取到项目本地构建目录,和你的应用一起编译,完全不会触碰系统全局环境,Windows和Linux都能无缝运行。
下面是一套完整的、可直接复用的CMake配置方案:
1. 基础CMake配置
首先在你的CMakeLists.txt开头设置最低版本和项目信息:
cmake_minimum_required(VERSION 3.11 FATAL_ERROR) project(MyOpenGLApp LANGUAGES CXX) # 启用FetchContent模块,用于拉取并构建依赖 include(FetchContent)
2. 逐个引入依赖库
GLM(头文件库,无需编译)
GLM是纯头文件库,拉取后直接引入头文件路径即可,选一个稳定的版本号:
FetchContent_Declare( glm GIT_REPOSITORY https://github.com/g-truc/glm.git GIT_TAG 0.9.9.8 # 可替换为你需要的版本,比如最新的稳定版 ) FetchContent_MakeAvailable(glm)
GLFW(需要编译,关闭冗余构建选项)
GLFW需要编译,我们要关闭示例、测试、文档这些不需要的部分,减少编译时间:
FetchContent_Declare( glfw GIT_REPOSITORY https://github.com/glfw/glfw.git GIT_TAG 3.3.8 # 稳定版本,兼容性好 ) # 设置GLFW的编译选项,跨平台通用 set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "Build GLFW examples") set(GLFW_BUILD_TESTS OFF CACHE BOOL "Build GLFW tests") set(GLFW_BUILD_DOCS OFF CACHE BOOL "Build GLFW documentation") set(GLFW_INSTALL OFF CACHE BOOL "Generate installation target") FetchContent_MakeAvailable(glfw)
glbinding(OpenGL绑定库,关闭冗余构建)
glbinding同样需要编译,同样关闭不需要的组件:
FetchContent_Declare( glbinding GIT_REPOSITORY https://github.com/cginternals/glbinding.git GIT_TAG v3.3.0 # 稳定版本 ) # 设置glbinding的编译选项 set(GLBINDING_BUILD_EXAMPLES OFF CACHE BOOL "Build glbinding examples") set(GLBINDING_BUILD_TESTS OFF CACHE BOOL "Build glbinding tests") set(GLBINDING_BUILD_TOOLS OFF CACHE BOOL "Build glbinding tools") set(GLBINDING_INSTALL OFF CACHE BOOL "Generate installation target") FetchContent_MakeAvailable(glbinding)
3. 配置你的应用
添加你的可执行文件,并链接所有依赖库:
# 替换成你的应用源码文件,比如main.cpp、renderer.cpp等 add_executable(MyOpenGLApp main.cpp) # 设置C++标准,OpenGL应用建议用C++17及以上 target_compile_features(MyOpenGLApp PRIVATE cxx_std_17) # 链接所有依赖库 target_link_libraries(MyOpenGLApp PRIVATE glm::glm glfw glbinding::glbinding glbinding::glbinding-aux # 如果需要glbinding的辅助工具,比如日志、回调,就加上 )
4. 跨平台注意事项
- Windows:CMake会自动适配MSVC或MinGW工具链,不需要额外配置,只要你的CMake环境正常。
- Linux:确保系统有OpenGL的基础依赖(比如
libx11-dev、libxi-dev、libgl1-mesa-dev等)——这些是系统基础包,一般发行版默认自带,如果没有,可能需要联系管理员安装(GLFW构建必须依赖这些)。 - 缓存机制:第一次构建时,CMake会自动从GitHub拉取依赖源码,之后会缓存到本地,后续构建不会重复拉取,速度更快。
- 本地源码替换:如果你已经下载了依赖库的源码,不想从GitHub拉取,可以在
FetchContent_Declare之前设置变量,比如:
这样CMake会使用你本地的源码目录。set(FetchContent_SOURCE_DIR_GLM "${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/glm")
这套方案完全不需要系统权限,所有依赖产物都在项目的构建目录里,跨平台兼容性拉满,你只需要专注于自己的OpenGL应用代码就行。
内容的提问来源于stack exchange,提问作者user975989
相关产品推荐
相关产品推荐

