将ImGui集成至现有OpenGL项目时遭遇LNK2019链接错误
问题
我正在维护一个现有OpenGL项目,尝试集成ImGui组件。已将所有ImGui相关文件加入项目,并在主文件basic.cc中引用了必要头文件,但通过Makefile执行编译命令cl $(COMMON) basic.cc ../lib/glfw3dll.lib时,出现了15个LNK2019未解析外部符号错误,涉及ImGui核心函数及ImGui_ImplGlfw、ImGui_ImplOpenGL3相关实现函数。
引用的头文件如下:
#include <cstdio> #include <cstring> #include <GLFW/glfw3.h> #include <ImGui/imgui.h> #include <ImGui/imgui_impl_glfw.h> #include <ImGui/imgui_impl_opengl3.h>
具体错误信息:
/out:../bin/basic.exe basic.obj ../lib/glfw3dll.lib basic.obj : error LNK2019: unresolved external symbol "struct ImGuiContext * __cdecl ImGui::CreateContext(struct ImFontAtlas *)" (?CreateContext@ImGui@@YAPEAUImGuiContext@@PEAUImFontAtlas@@@Z) referenced in function main basic.obj : error LNK2019: unresolved external symbol "struct ImGuiIO & __cdecl ImGui::GetIO(void)" (?GetIO@ImGui@@YAAEAUImGuiIO@@XZ) referenced in function main basic.obj : error LNK2019: unresolved external symbol "void __cdecl ImGui::NewFrame(void)" (?NewFrame@ImGui@@YAXXZ) referenced in function main basic.obj : error LNK2019: unresolved external symbol "void __cdecl ImGui::Render(void)" (?Render@ImGui@@YAXXZ) referenced in function main basic.obj : error LNK2019: unresolved external symbol "struct ImDrawData * __cdecl ImGui::GetDrawData(void)" (?GetDrawData@ImGui@@YAPEAUImDrawData@@XZ) referenced in function main basic.obj : error LNK2019: unresolved external symbol "void __cdecl ImGui::StyleColorsDark(struct ImGuiStyle *)" (?StyleColorsDark@ImGui@@YAXPEAUImGuiStyle@@@Z) referenced in function main basic.obj : error LNK2019: unresolved external symbol "bool __cdecl ImGui::Begin(char const *,bool *,int)" (?Begin@ImGui@@YA_NPEBDPEA_NH@Z) referenced in function main basic.obj : error LNK2019: unresolved external symbol "void __cdecl ImGui::End(void)" (?End@ImGui@@YAXXZ) referenced in function main basic.obj : error LNK2019: unresolved external symbol "bool __cdecl ImGui::Button(char const *,struct ImVec2 const &)" (?Button@ImGui@@YA_NPEBDAEBUImVec2@@@Z) referenced in function main basic.obj : error LNK2019: unresolved external symbol "bool __cdecl ImGui::DebugCheckVersionAndDataLayout(char const *,unsigned __int64,unsigned __int64,unsigned __int64,unsigned __int64,unsigned __int64,unsigned __int64)" (?DebugCheckVersionAndDataLayout@ImGui@@YA_NPEBD_K11111@Z) referenced in function main basic.obj : error LNK2019: unresolved external symbol "bool __cdecl ImGui_ImplGlfw_InitForOpenGL(struct GLFWwindow *,bool)" (?ImGui_ImplGlfw_InitForOpenGL@@YA_NPEAUGLFWwindow@@_N@Z) referenced in function main basic.obj : error LNK2019: unresolved external symbol "void __cdecl ImGui_ImplGlfw_NewFrame(void)" (?ImGui_ImplGlfw_NewFrame@@YAXXZ) referenced in function main basic.obj : error LNK2019: unresolved external symbol "bool __cdecl ImGui_ImplOpenGL3_Init(char const *)" (?ImGui_ImplOpenGL3_Init@@YA_NPEBD@Z) referenced in function main basic.obj : error LNK2019: unresolved external symbol "void __cdecl ImGui_ImplOpenGL3_NewFrame(void)" (?ImGui_ImplOpenGL3_NewFrame@@YAXXZ) referenced in function main basic.obj : error LNK2019: unresolved external symbol "void __cdecl ImGui_ImplOpenGL3_RenderDrawData(struct ImDrawData *)" (?ImGui_ImplOpenGL3_RenderDrawData@@YAXPEAUImDrawData@@@Z) referenced in function main ..\bin\basic.exe : fatal error LNK1120: 15 unresolved externals
解决方案
编译ImGui源码文件:仅引用头文件不足以让编译器找到函数实现,必须将ImGui的核心和绑定源码加入编译流程。需要添加的文件包括:
- 核心实现:
imgui.cpp、imgui_draw.cpp、imgui_tables.cpp、imgui_widgets.cpp - 平台绑定:
imgui_impl_glfw.cpp、imgui_impl_opengl3.cpp
修改Makefile中的编译命令,将这些文件加入,示例如下(需根据文件实际路径调整):
cl $(COMMON) basic.cc ../ImGui/imgui.cpp ../ImGui/imgui_draw.cpp ../ImGui/imgui_tables.cpp ../ImGui/imgui_widgets.cpp ../ImGui/imgui_impl_glfw.cpp ../ImGui/imgui_impl_opengl3.cpp ../lib/glfw3dll.lib- 核心实现:
统一编译选项:确保ImGui源码和项目的编译选项一致:
- 由于使用了动态链接的GLFW(
glfw3dll.lib),编译时需添加-DGLFW_DLL宏定义,保证ImGui的GLFW绑定代码匹配动态链接模式。 - 确认开启C++11及以上标准,ImGui依赖该特性,可添加
/std:c++17(或对应版本)参数。
- 由于使用了动态链接的GLFW(
校验文件路径:检查Makefile中所有ImGui源码文件的路径是否正确,避免因路径错误导致编译器无法找到文件,进而遗漏编译。
确认符号一致性:确保代码中调用的ImGui函数未修改命名空间,且编译时的调用约定(如
__cdecl)与头文件声明一致,避免因符号修饰规则不匹配导致链接错误。
内容的提问来源于stack exchange,提问作者Samir Kumar Patro
相关产品推荐
相关产品推荐

