使用CMake+Vcpkg构建ImGui+GLFW时遇链接错误求助
问题概述
尝试通过Vcpkg和CMake本地构建并集成ImGui与GLFW,参照SDL2+ImGui教程适配GLFW代码后,出现两类错误:
- main.obj中
__imp_glClear等OpenGL函数未解析 - CMake提示
IMGUI_LIBRARY未找到
此前全局安装ImGui可在Visual Studio正常使用,本次需求为本地构建,已尝试相关链接方案无效。
报错信息
第一类链接错误:
main.obj : error LNK2019: 无法解析的外部符号 __imp_glClear,函数 main 中引用了该符号
...(其他类似OpenGL函数未解析错误)第二类CMake错误:
CMake Error at CMakeLists.txt:XX (find_package):
Could not find a package configuration file provided by "ImGui" with any of
the following names:ImGuiConfig.cmake imgui-config.cmakeAdd the installation prefix of "ImGui" to CMAKE_PREFIX_PATH or set
"IMGUI_DIR" to a directory containing one of the above files. If "ImGui"
provides a separate development package or SDK, be sure it has been installed.
项目结构
my-project/ ├── src/ │ └── main.cpp ├── CMakeLists.txt └── vcpkg.json
原CMakeLists.txt
cmake_minimum_required(VERSION 3.20) project(my_imgui_app) find_package(glfw3 REQUIRED) find_package(ImGui REQUIRED) add_executable(my_app src/main.cpp) target_link_libraries(my_app PRIVATE glfw ImGui::ImGui)
原vcpkg.json
{ "name": "my-imgui-app", "version-string": "1.0.0", "dependencies": [ "glfw3", "imgui" ] }
示例main.cpp
#include <GLFW/glfw3.h> #include "imgui.h" #include "imgui_impl_glfw.h" #include "imgui_impl_opengl3.h" int main() { glfwInit(); GLFWwindow* window = glfwCreateWindow(800, 600, "ImGui GLFW Test", nullptr, nullptr); glfwMakeContextCurrent(window); IMGUI_CHECKVERSION(); ImGui::CreateContext(); ImGuiIO& io = ImGui::GetIO(); (void)io; ImGui::StyleColorsDark(); ImGui_ImplGlfw_InitForOpenGL(window, true); ImGui_ImplOpenGL3_Init("#version 130"); while (!glfwWindowShouldClose(window)) { glfwPollEvents(); ImGui_ImplOpenGL3_NewFrame(); ImGui_ImplGlfw_NewFrame(); ImGui::NewFrame(); ImGui::Begin("Hello, ImGui!"); ImGui::Text("This is a test window."); ImGui::End(); ImGui::Render(); glClear(GL_COLOR_BUFFER_BIT); ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); glfwSwapBuffers(window); } ImGui_ImplOpenGL3_Shutdown(); ImGui_ImplGlfw_Shutdown(); ImGui::DestroyContext(); glfwDestroyWindow(window); glfwTerminate(); return 0; }
解决方案
1. 解决OpenGL函数未解析问题
GLFW仅提供窗口管理,不包含OpenGL库链接,需手动添加跨平台的OpenGL库依赖:
# 在CMakeLists.txt中添加 if(WIN32) target_link_libraries(my_app PRIVATE opengl32) elseif(UNIX AND NOT APPLE) target_link_libraries(my_app PRIVATE GL) elseif(APPLE) target_link_libraries(my_app PRIVATE "-framework OpenGL") endif()
2. 解决IMGUI_LIBRARY未找到问题
Vcpkg中ImGui的CMake目标名称为小写imgui,且需确保安装包含GLFW/OpenGL绑定的版本:
- 修改vcpkg.json,添加ImGui的绑定特性:
{ "name": "my-imgui-app", "version-string": "1.0.0", "dependencies": [ "glfw3", { "name": "imgui", "features": ["glfw-binding", "opengl3-binding"] } ] }
- 修改CMakeLists.txt,修正ImGui的查找和链接逻辑:
cmake_minimum_required(VERSION 3.20) project(my_imgui_app) # 编译时必须指定Vcpkg工具链文件,示例命令: # cmake .. -DCMAKE_TOOLCHAIN_FILE=[vcpkg根目录]/scripts/buildsystems/vcpkg.cmake find_package(glfw3 REQUIRED) find_package(imgui REQUIRED) add_executable(my_app src/main.cpp) target_link_libraries(my_app PRIVATE glfw imgui) # 添加OpenGL库链接 if(WIN32) target_link_libraries(my_app PRIVATE opengl32) elseif(UNIX AND NOT APPLE) target_link_libraries(my_app PRIVATE GL) elseif(APPLE) target_link_libraries(my_app PRIVATE "-framework OpenGL") endif()
3. 编译命令示例
mkdir build && cd build cmake .. -DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake cmake --build .
内容的提问来源于stack exchange,提问作者Kris93

