OpenGL on Arch Linux – Linker Error: Undefined Reference

Issue

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
    glfwInit();

    // 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
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

    // 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;
        glfwTerminate();
        return -1;
    }
    // Introduce the window into the current context
    glfwMakeContextCurrent(window);

    //Load GLAD so it configures OpenGL
    gladLoadGL();
    // 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;
    VAO1.Bind();

    // 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
    VAO1.Unbind();
    VBO1.Unbind();
    EBO1.Unbind();



    // 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
        glClear(GL_COLOR_BUFFER_BIT);
        // Tell OpenGL which Shader Program we want to use
        // shaderProgram.Activate();
        // Bind the VAO so OpenGL knows to use it
        VAO1.Bind();
        // 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
        glfwSwapBuffers(window);
        // Take care of all GLFW events
        glfwPollEvents();
    }



    // Delete all the objects we've created
    VAO1.Delete();
    VBO1.Delete();
    EBO1.Delete();
    // shaderProgram.Delete();
    // Delete window before ending the program
    glfwDestroyWindow(window);
    // Terminate GLFW before ending the program
    glfwTerminate();
    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 – https://github.com/Qeatrix/Learn_OpenGL

Solution

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

CC=gcc
CXX=g++

all: demo

.PHONY: clean

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