首先,我知道什么是未解决的外部错误,因此我在这里询问为什么来自 ImGui 的文件没有将其声明的函数链接到 cpp 中这些函数的定义。我不应该接触的两个文件没有链接,我得到外部错误
我正在使用没有 openGL 实现的 SDL2 开发引擎。这是一个不会使用图形的应用程序,我只需要 SDL2 来打开一个窗口,我将在其中使用 ImGUI 和其他。
因此,当我尝试将 ImGui 包含到我的 sln 中时,问题就开始了。
我有:
DocA.cpp
在本文档中,我在 DOC_MAIN.cpp 中调用了不同的函数。此函数遵循一般应用程序模式:Init()、Start() PreUpdate() Update() postUpdate() clean()。
在 SDL2 ImGui 示例之后,我开始在这些不同的函数中添加代码,以便在不同的阶段执行它。就在我确定我在创建 sdl2 窗口时没有任何问题时遵循了示例,我开始为 ImGui 编写初始化代码。示例中显示了这两个函数:
// Setup Platform/Renderer backends
ImGui_ImplSDL2_InitForOpenGL(App->window->window,App->window->gl_context);
ImGui_ImplOpenGL2_Init();
为了使用这两个功能,在我的文档顶部包含 Imgui.h 是不够的。实际上,实施了 ImGui 的示例文档正在使用它,包括:
#include "imgui.h"
#include "imgui_impl_sdl.h"
#include "imgui_impl_opengl2.h"
这两个包含对于使用上面显示的这两个功能很重要。文档的漏洞代码如下所示:
#include "ModuleImGui.h"
#include "..\imgui-1.83\imgui.h"
#include "..\imgui-1.83\backends\imgui_impl_opengl2.h"
#include "..\imgui-1.83\backends\imgui_impl_sdl.h"
#include <SDL.h>
#include <SDL_opengl.h>
#include "App.h"
bool ModuleImGui::Init() {
bool ret = true;
printf("ModuleImGui Init()\n");
// Setup Dear ImGui context
IMGUI_CHECKVERSION();
ImGui::CreateContext();//1
ImGuiIO& io = ImGui::GetIO(); (void)io;
//io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls
//io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls
// Setup Dear ImGui style
ImGui::StyleColorsDark();
////ImGui::StyleColorsClassic();
// Setup Platform/Renderer backends
ImGui_ImplSDL2_InitForOpenGL(App->window->window,App->window->gl_context);
ImGui_ImplOpenGL2_Init();
return ret;
}
这两个函数给了我外部错误。我这样做是为了解决它:
检查是否在不同的文档中多次添加了像 ImGui 这样的标题,这可能会导致外部错误。
将所有 ImGui 文档添加到我的解决方案中,包括这两个给我错误的函数的标题和 cpp。
从我的解决方案中删除了所有 ImGui 文档,只包含绝对路径...