1

I'm making a program that uses OpenGL and SDL2 in C and wanted to use Cimgui as my gui library however, when trying to include the correct backends I'm getting these linker errors:

main.c:104:5: warning: implicit declaration of function 'ImGui_ImplSDL2_InitForOpenGL' [-Wimplicit-function-declaration]
  104 |     ImGui_ImplSDL2_InitForOpenGL(window, context);
      |     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
main.c:105:5: warning: implicit declaration of function 'ImGui_ImplOpenGL3_Init' [-Wimplicit-function-declaration]
  105 |     ImGui_ImplOpenGL3_Init(glsl_version);


          |     ^~~~~~~~~~~~~~~~~~~~~~

C:/TDM-GCC-64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: ./main.o:main.c:(.text+0x386): undefined reference to `ImGui_ImplSDL2_InitForOpenGL'
C:/TDM-GCC-64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: ./main.o:main.c:(.text+0x395): undefined reference to `ImGui_ImplOpenGL3_Init'
collect2.exe: error: ld returned 1 exit status
make: *** [renderer.exe] Error 1

Here is my makefile (I'm a beginner here so if theres anything stupid going on apologies):

# Compiler definitions
CC = gcc
CXX = g++

# Compiler flags
CFLAGS = -I"C:/Cimgui" -I"C:/Cimgui/imgui" -I"C:/Cimgui" -I"C:/Cimgui/imgui/backends" -I"C:/SDL2/include" -I"C:/cglm-master/include" -I"C:/glew-2.1.0/include" \
         -Wall -DGLEW_STATIC -DSDL_STATIC \
         -DIMGUI_IMPL_OPENGL_LOADER_GLEW -DIMGUI_DISABLE_OBSOLETE_FUNCTIONS=1
CXXFLAGS = $(CFLAGS)  # Same flags for C++ files

# Linker flags
LDFLAGS = -L"C:/Cimgui/build" -L"C:/cglm-master/build" -L"C:/glew-2.1.0/lib/Release/x64" -L"C:/SDL2/lib" \
          -Wl,-Bstatic -lSDL2main -lSDL2 -lcglm -lglew32 \
          -Wl,-Bdynamic -lopengl32 -ldxguid \
          -lmingw32 -mwindows -lm -ldinput8 -ldxguid -ldxerr8 \
          -luser32 -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 \
          -lshell32 -lversion -luuid -static-libgcc \
          -lsetupapi -lcfgmgr32 \
          -lcimgui 

# Target executable
TARGET = renderer.exe

# Define source files
SOURCES = ./main.c
IMGUI_SOURCES = \
    C:/Cimgui/cimgui.cpp \
    C:/Cimgui/cimgui_impl.cpp \
    C:/Cimgui/imgui/imgui.cpp \
    C:/Cimgui/imgui/imgui_draw.cpp \
    C:/Cimgui/imgui/imgui_widgets.cpp \
    C:/Cimgui/imgui/imgui_tables.cpp \
    C:/Cimgui/imgui/imgui_demo.cpp \
    C:/Cimgui/imgui/backends/imgui_impl_sdl2.cpp \
    C:/Cimgui/imgui/backends/imgui_impl_opengl3.cpp

# Convert sources to object files
OBJECTS = $(SOURCES:.c=.o) $(IMGUI_SOURCES:.cpp=.o)

# Default target
all: $(TARGET)

# Link all object files into the executable
$(TARGET): $(OBJECTS)
    echo "Objects to link: $(OBJECTS)"
    $(CXX) $(OBJECTS) -o $(TARGET) $(LDFLAGS)

%.o: %.c
    $(CC) $(CFLAGS) -c $< -o $@

%.o: %.cpp
    $(CXX) $(CXXFLAGS) -c $< -o $@

# Run the program
run:
    ./$(TARGET)

# Clean up
clean:
    rm -f $(OBJECTS) $(TARGET)

.PHONY: all clean run

I tried to follow the example CMakeLists.txt thats included with the sdl_opengl cimgui example project as much as possible but for some reason it cannot find these methods. For reference here is my main.c file:

#include <stdio.h>
#define SDL_MAIN_HANDLED
#include <SDL.h>
#include <GL/glew.h>
#include <stdbool.h>
#include <cglm/cglm.h>
#define CIMGUI_DEFINE_ENUMS_AND_STRUCTS
#include <cimgui.h>
#include <cimgui_impl.h>
#include <windows.h>
static int window_width = 640;
static int window_height = 480;


///////////////////////////////////////////////////////////////////////////////
// Global variables for execution status and game loop
///////////////////////////////////////////////////////////////////////////////
static SDL_Window* window = NULL;
SDL_GLContext context = NULL;
static SDL_Renderer* renderer = NULL;
float delta_time = 0;
bool is_running = false;
float previous_frame_time;

 
//set docking
ImGuiIO* ioptr;
const char* glsl_version = "#version 130";
 
///////////////////////////////////////////////////////////////////////////////
// Setup function to initialize variables and game objects
///////////////////////////////////////////////////////////////////////////////
int setup(void) {
      if(SDL_Init(SDL_INIT_EVERYTHING) != 0){
        fprintf(stderr, "Error initializing SDL window");
        return false;
    }

    SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
    SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8);

    SDL_DisplayMode displayMode;

    SDL_GetCurrentDisplayMode(0, &displayMode);

    // int full_screen_width = displayMode.w;
    // int full_screen_height = displayMode.h;

    vec3 v = {1.0f, 2.0f, 3.0f};
    printf("current vec3: (%f, %f, %f)", v[0],v[1],v[2]);


    // //TODO create SDL window
    window = SDL_CreateWindow(
        "The window into Jamie's madness",
        SDL_WINDOWPOS_CENTERED,
        SDL_WINDOWPOS_CENTERED,
        window_width,
        window_height,
        SDL_WINDOW_OPENGL
    );

    if(!window){
        fprintf(stderr, "Error creating SDL window");
        return false;
    }

    //TODO create SDL Renderer
    renderer = SDL_CreateRenderer(window,-1, 0);

    if(!renderer){
        fprintf(stderr, "Error creating SDL renderer");
        return false;
    }

    SDL_SetWindowBordered(window,SDL_WINDOWPOS_CENTERED);
    SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 5 );
    SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 5 );
    SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 5 );
    SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 16 );
    SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
    context = SDL_GL_CreateContext(window);
    SDL_GL_MakeCurrent(window,context);
    

    glewExperimental = GL_TRUE;
    glewInit();
    
    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

     // setup imgui
    igCreateContext(NULL);
    ioptr = igGetIO();
    ioptr->ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;       // Enable Keyboard Controls
    //ioptr->ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad;      // Enable Gamepad Controls
    #ifdef IMGUI_HAS_DOCK
        ioptr->ConfigFlags |= ImGuiConfigFlags_DockingEnable;           // Enable Docking
        ioptr->ConfigFlags |= ImGuiConfigFlags_ViewportsEnable;         // Enable Multi-Viewport / Platform Windows
    #endif

    ImGui_ImplSDL2_InitForOpenGL(window, context);
    ImGui_ImplOpenGL3_Init(glsl_version);

    igStyleColorsDark(NULL);

    return true; 
}
int main(int argc, char* args[]){
    setup();
    return 0;
}
7
  • I've added the errors in Commented Mar 23 at 16:53
  • I never said they were compile errors Commented Mar 23 at 16:54
  • This question is similar to: What is an undefined reference/unresolved external symbol error and how do I fix it?. If you believe it’s different, please edit the question, make it clear how it’s different and/or how the answers on that question are not helpful for your problem. Commented Mar 23 at 16:56
  • Judging by the contents of cimgui_impl.h you are missing #define CIMGUI_USE_OPENGL3 and #define CIMGUI_USE_SDL2 from main.c Commented Mar 23 at 17:04
  • See github.com/cimgui/cimgui/issues/157 Commented Mar 23 at 17:07

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.