OpenGL on Arch Linux – Linker Error: Undefined Reference


I have a problem. I recently started learning OpenGL from YouTube. After the lesson "Organizing" after compiling I got errors like an undefined references. I have been comparing code for a long time, copying it from original repositories, but nothing helped.

main.cpp file:

#include <iostream>
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <math.h>
#include <stdio.h>

#include "shaderClass.h"
#include "VBO.h"
#include "VAO.h"
#include "EBO.h"

// Vertices coordinates
GLfloat vertices[] =
    -0.5f, -0.5f * float(sqrt(3)) / 3, 0.0f, // Lower left corner
    0.5f, -0.5f * float(sqrt(3)) / 3, 0.0f, // Lower right corner
    0.0f, 0.5f * float(sqrt(3)) * 2 / 3, 0.0f, // Upper corner
    -0.5f / 2, 0.5f * float(sqrt(3)) / 6, 0.0f, // Inner left
    0.5f / 2, 0.5f * float(sqrt(3)) / 6, 0.0f, // Inner right
    0.0f, -0.5f * float(sqrt(3)) / 3, 0.0f // Inner down

// Indices for vertices order
GLuint indices[] =
    0, 3, 5, // Lower left triangle
    3, 2, 4, // Lower right triangle
    5, 4, 1 // Upper triangle

int main()
    // Initialize GLFW

    // Tell GLFW what version of OpenGL we are using
    // In this case we are using OpenGL 3.3
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    // Tell GLFW we are using the CORE profile
    // So that means we only have the modern functions

    // Create a GLFWwindow object of 800 by 800 pixels, naming it "YoutubeOpenGL"
    GLFWwindow* window = glfwCreateWindow(800, 800, "YoutubeOpenGL", NULL, NULL);
    // Error check if the window fails to create
    if (window == NULL)
        std::cout << "Failed to create GLFW window" << std::endl;
        return -1;
    // Introduce the window into the current context

    //Load GLAD so it configures OpenGL
    // Specify the viewport of OpenGL in the Window
    // In this case the viewport goes from x = 0, y = 0, to x = 800, y = 800
    glViewport(0, 0, 800, 800);

    // Generates Shader object using shaders defualt.vert and default.frag
    // Shader shaderProgram("default.vert", "default.frag");

    // Generates Vertex Array Object and binds it
    VAO VAO1;

    // Generates Vertex Buffer Object and links it to vertices
    VBO VBO1(vertices, sizeof(vertices));
    // Generates Element Buffer Object and links it to indices
    EBO EBO1(indices, sizeof(indices));

    // Links VBO to VAO
    VAO1.LinkVBO(VBO1, 0);
    // Unbind all to prevent accidentally modifying them

    // Main while loop
    while (!glfwWindowShouldClose(window))
        // Specify the color of the background
        glClearColor(0.07f, 0.13f, 0.17f, 1.0f);
        // Clean the back buffer and assign the new color to it
        // Tell OpenGL which Shader Program we want to use
        // shaderProgram.Activate();
        // Bind the VAO so OpenGL knows to use it
        // Draw primitives, number of indices, datatype of indices, index of indices
        glDrawElements(GL_TRIANGLES, 9, GL_UNSIGNED_INT, 0);
        // Swap the back buffer with the front buffer
        // Take care of all GLFW events

    // Delete all the objects we've created
    // shaderProgram.Delete();
    // Delete window before ending the program
    // Terminate GLFW before ending the program
    return 0;

I compile the code with the command g++ main.cpp -o program glad.c -Wall -lGL -lGLU -lglut -lGLEW -lglfw -lX11 -lXxf86vm -lXrandr -lpthread -lXi -ldl -lXinerama -lXcursor and I see such errors:

/usr/bin/ld: /tmp/ccUbCcD3.o: in function `main':
main.cpp:(.text+0xed): undefined reference to `VAO::VAO()'
/usr/bin/ld: main.cpp:(.text+0xf9): undefined reference to `VAO::Bind()'
/usr/bin/ld: main.cpp:(.text+0x114): undefined reference to `VBO::VBO(float*, long)'
/usr/bin/ld: main.cpp:(.text+0x12f): undefined reference to `EBO::EBO(unsigned int*, long)'
/usr/bin/ld: main.cpp:(.text+0x147): undefined reference to `VAO::LinkVBO(VBO&, unsigned int)'
/usr/bin/ld: main.cpp:(.text+0x153): undefined reference to `VAO::Unbind()'
/usr/bin/ld: main.cpp:(.text+0x15f): undefined reference to `VBO::Unbind()'
/usr/bin/ld: main.cpp:(.text+0x16b): undefined reference to `EBO::Unbind()'
/usr/bin/ld: main.cpp:(.text+0x1b2): undefined reference to `VAO::Bind()'
/usr/bin/ld: main.cpp:(.text+0x205): undefined reference to `VAO::Delete()'
/usr/bin/ld: main.cpp:(.text+0x211): undefined reference to `VBO::Delete()'
/usr/bin/ld: main.cpp:(.text+0x21d): undefined reference to `EBO::Delete()'
collect2: error: ld returned 1 exit status

I uploaded my entire project to Github –


Your compilation is not complete, you only try to compile one file, whereas there is several.

You can use theses command to compile :

# compile the CĀ file
gcc -c -Wall glad.c -I lib/include/

# compile the c++ files 
g++ -c -Wall -I lib/include EBO.cpp
g++ -c -Wall -I lib/include main.cpp
g++ -c -Wall -I lib/include shaderClass.cpp
g++ -c -Wall -I lib/include VAO.cpp
g++ -c -Wall -I lib/include VBO.cpp

# link the object files
g++ -o demo EBO.o glad.o main.o shaderClass.o VAO.o VBO.o -lglfw -ldl

Or you could use some Makefile:

CFLAGS= -C -Wall  -I lib/include
CXXFLAGS= -C -Wall  -I lib/include
LDFLAGS= -lglfw -ldl


all: demo

.PHONY: clean

    rm *.o

glad.o: glad.c 
    $(CC) $(CFLAGS) $< -c -o [email protected]

%.o: %.c 
    $(CXX) $(CXXFLAGS) $< -c -o [email protected]

demo: EBO.o glad.o main.o shaderClass.o VAO.o VBO.o
    $(CXX) $^ -o [email protected] $(LDFLAGS)

and type make to compile

Answered By – Mathieu

This Answer collected from stackoverflow, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply

(*) Required, Your email will not be published