Home > Software engineering >  CMake can't link a custom library
CMake can't link a custom library

Time:11-30

I'm building a game with raylib and made my own custom button in different files to reuse it when I need it.

I watched tons of videos and read docs but I don't know why it throws undefined reference to CustomButton::CustomButton().

Here's the error:

/usr/bin/ld: CMakeFiles/AstroX.dir/src/main.cpp.o: in function `_GLOBAL__sub_I_main':
main.cpp:(.text.startup 0xaca): undefined reference to `CustomButton::CustomButton(Vector2, float, Texture2D, char const*, int, Color)'
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/AstroX.dir/build.make:105: AstroX] Error 1
make[1]: *** [CMakeFiles/Makefile2:153: CMakeFiles/AstroX.dir/all] Error 2
make: *** [Makefile:156: all] Error 2

Here's my folder structure:

Folder Structure

My CMakeLists.txt:

cmake_minimum_required(VERSION 3.0)

project(AstroX VERSION 1.0.0)

set(CMAKE_CXX_STANDARD 17)

# Setting parameters for raylib
set(BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) # don't build the supplied examples
set(BUILD_GAMES    OFF CACHE BOOL "" FORCE) # or games


add_library(
    custom_button
    src/custom_button.cpp
    src/custom_button.hpp
)
    
add_subdirectory(libs/raylib)

add_executable(${PROJECT_NAME} src/main.cpp)

target_link_libraries(AstroX PRIVATE custom_button)

target_link_libraries(${PROJECT_NAME} PRIVATE raylib)

Here's my custom_button.hpp:

#ifndef BUTTON_INCLUDED

#define BUTTON_INCLUDED
#include "raylib.h"

class CustomButton {
    public:

        // Position and the size of the button
        Vector2 position;   // position of the button (x,y)
        float scale;        // scale of the button

        // Texture and Text inside it
        Texture2D texture;  // texture of the button
        const char* text;   // text of the button (placed in the middle of the button)
        int fontSize;       // font size of the text
        Color textColor;    // color of the text

        // Constructor
        CustomButton(Vector2 position, float scale, Texture2D texture, const char* text, int fontSize, Color textColor);

        // State getters
        bool isHovered();   // check if the mouse is hovering over the button
        bool isClicked();   // check if the button is clicked

};

#endif

My custom_button.cpp:

#include "custom_button.hpp"

CustomButton::CustomButton(Vector2 position, float scale, Texture2D texture, const char* text, int fontSize, Color textColor) {
    this->position = position;
    this->scale = scale;
    this->texture = texture;
    this->text = text;
    this->fontSize = fontSize;
    this->textColor = textColor;
}

bool CustomButton::isHovered() {
    Vector2 mouse_location = GetMousePosition();
    if (mouse_location.x > position.x && mouse_location.x < position.x   texture.width * scale &&
        mouse_location.y > position.y && mouse_location.y < position.y   texture.height * scale) {
        return true;
    }
    return false;
}

bool CustomButton::isClicked() {
    if (isHovered()) {
        if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) {
            return true;
        }
    }
    return false;
}

And finally my main.cpp:

#include "raylib.h"
#include <string>
#include <math.h>

#include "custom_button.hpp"

#define PLAYER_SIZE  0.2f
#define PLAYER_SPEED 6.0f
#define PLAYER_ACCELERATION 0.5f
#define PLAYER_MAX_ACCELERATION 2.0f
#define DRAG 0.04f


//------
// Types
//------
struct Player {
    Vector2 position;
    Vector2 speed;
    float acceleration;
    float rotation;
};

//--------
// Globals
//--------
static const int screenWidth = 1000;
static const int screenHeight = 800;

static bool gameOver = false;
static bool pause = false;
static bool victory = false;

static float shipHeight = 0.0f;

static Player player = { 0 };
static Texture2D playerTexture;

static Texture2D btnTexture;
static CustomButton btnPlay = CustomButton(Vector2{ screenWidth / 2, screenHeight / 2 }, 0.5f, btnTexture, "Play", 20, WHITE );

static void InitGame();         // Initialize game
static void UpdateGame();       // Update game (one frame)
static void DrawGame();         // Draw game (one frame)
static void UnloadGame();       // Unload game
static void UpdateDrawFrame();  // Update and Draw (one frame)

int main()
{
    InitWindow(screenWidth, screenHeight, "AstroX");
    SetTargetFPS(60);
    InitGame();

    while (!WindowShouldClose())
    {
        UpdateDrawFrame();
    }

    UnloadGame();        
    CloseWindow(); 

    return 0;
}

//-----------
// Functions
//-----------

// Initialize game variables
void InitGame()
{
    bool correctRange = false;
    victory = false;
    pause = false;

    shipHeight = (playerTexture.height * PLAYER_SIZE) / tanf(20*DEG2RAD);

    // Initialization player
    playerTexture = LoadTexture("/home/d3r1n/Desktop/Projects/AstroX/assets/Spaceship.png");
    player.position = Vector2 {screenWidth/2 - (float) playerTexture.width * PLAYER_SIZE, screenHeight / 2 - (float) playerTexture.height * PLAYER_SIZE};
    player.speed = Vector2 {0, 0};
    player.acceleration = 0;
    player.rotation = 0;
}

// Update game (one frame)
void UpdateGame(void)
{
    if (!gameOver)
    {
        if (IsKeyPressed('P')) pause = !pause;

        if (!pause)
        {
            // Player logic: rotation
            if (IsKeyDown(KEY_LEFT)) player.rotation -= 5;
            if (IsKeyDown(KEY_RIGHT)) player.rotation  = 5;
            if (player.rotation > 360) player.rotation -= 360;
            if (player.rotation < -360) player.rotation  = 360;

            // Player logic: speed
            player.speed.x = sin(player.rotation*DEG2RAD)*PLAYER_SPEED;
            player.speed.y = cos(player.rotation*DEG2RAD)*PLAYER_SPEED;

            // Player logic: acceleration
            if (IsKeyDown(KEY_UP))
            {
                if (player.acceleration < PLAYER_MAX_ACCELERATION) player.acceleration  = PLAYER_ACCELERATION;
            }
            else
            {
                if (player.acceleration > 0) player.acceleration -= DRAG;
                else if (player.acceleration < 0) player.acceleration = 0;
            }
            if (IsKeyDown(KEY_DOWN))
            {
                if (player.acceleration > 0) player.acceleration -= PLAYER_ACCELERATION / 2;
                else if (player.acceleration < 0) player.acceleration = 0;
            }

            // Player logic: movement
            player.position.x  = (player.speed.x * player.acceleration);
            player.position.y -= (player.speed.y * player.acceleration);

            // Collision logic: player vs walls
            if (player.position.x > screenWidth   shipHeight) player.position.x = -(shipHeight);
            else if (player.position.x < -(shipHeight)) player.position.x = screenWidth   shipHeight;
            if (player.position.y > (screenHeight   shipHeight)) player.position.y = -(shipHeight);
            else if (player.position.y < -(shipHeight)) player.position.y = screenHeight   shipHeight;
        }
    }
    else
    {
        if (IsKeyPressed(KEY_ENTER))
        {
            InitGame();
            gameOver = false;
        }
    }
}

// Draw game (one frame)
void DrawGame()
{
    BeginDrawing();

        ClearBackground(RAYWHITE);

        if (!gameOver)
        {
            // Draw player
            DrawTexturePro(
                playerTexture, 
                Rectangle {1, 1, (float)playerTexture.width, (float)playerTexture.height}, 
                Rectangle {player.position.x, player.position.y, (float)playerTexture.width * PLAYER_SIZE, (float)playerTexture.height * PLAYER_SIZE}, 
                Vector2 {(float)playerTexture.width * PLAYER_SIZE / 2, (float)playerTexture.height * PLAYER_SIZE / 2}, 
                player.rotation,
                WHITE
            );

        
            // Draw FPS
            DrawText("FPS:", 10, 10, 20, BLACK);
            DrawText(std::to_string(GetFPS()).c_str(), MeasureText("FPS:", 20)   20, 10, 20, GREEN);
            
            // Draw player acceleration
            DrawText("Acceleration:", 10, 30, 20, BLACK);
            DrawText(std::to_string(player.acceleration).c_str(), MeasureText("Acceleration:", 20)   20, 30, 20, BLACK);

            // Draw player rotation
            DrawText("Rotation:", 10, 50, 20, BLACK);
            DrawText(std::to_string(player.rotation).c_str(), MeasureText("Rotation:", 20)   20, 50, 20, BLACK);
        }
        else
        {
            DrawText("Game Over!", screenWidth/2 - MeasureText("Game Over!", 30)/2, screenHeight/2 - 30, 30, RED);
            DrawText("Press ENTER to restart", screenWidth/2 - MeasureText("Press ENTER to restart", 20)/2, screenHeight/2   30, 20, RED);
        }

        if (!gameOver)
        {

            if (victory) DrawText("VICTORY", screenWidth/2 - MeasureText("VICTORY", 20)/2, screenHeight/2, 20, LIGHTGRAY);

            if (pause) {
                DrawText("GAME PAUSED", screenWidth/2 - MeasureText("GAME PAUSED", 40)/2, screenHeight/2 - 40, 40, Color{150, 150, 150, 255});
            }
        }
        else {
            DrawText("PRESS [ENTER] TO PLAY AGAIN", GetScreenWidth()/2 - MeasureText("PRESS [ENTER] TO PLAY AGAIN", 20)/2, GetScreenHeight()/2 - 50, 20, GRAY);
        }

    EndDrawing();
}

// Unload game variables
void UnloadGame()
{
    // TODO: Unload all dynamic loaded data (textures, sounds, models...)
}

// Update and Draw (one frame)
void UpdateDrawFrame()
{
    UpdateGame();
    DrawGame();
}

Verbose Output (cmake --build . --verbose) :

/usr/bin/cmake -S/home/d3r1n/Desktop/Projects/AstroX -B/home/d3r1n/Desktop/Projects/AstroX/build --check-build-system CMakeFiles/Makefile.cmake 0
/usr/bin/cmake -E cmake_progress_start /home/d3r1n/Desktop/Projects/AstroX/build/CMakeFiles /home/d3r1n/Desktop/Projects/AstroX/build//CMakeFiles/progress.marks
/usr/bin/make  -f CMakeFiles/Makefile2 all
make[1]: Entering directory '/home/d3r1n/Desktop/Projects/AstroX/build'
/usr/bin/make  -f libs/raylib/src/external/glfw/src/CMakeFiles/glfw_objlib.dir/build.make libs/raylib/src/external/glfw/src/CMakeFiles/glfw_objlib.dir/depend
make[2]: Entering directory '/home/d3r1n/Desktop/Projects/AstroX/build'
cd /home/d3r1n/Desktop/Projects/AstroX/build && /usr/bin/cmake -E cmake_depends "Unix Makefiles" /home/d3r1n/Desktop/Projects/AstroX /home/d3r1n/Desktop/Projects/AstroX/libs/raylib/src/external/glfw/src /home/d3r1n/Desktop/Projects/AstroX/build /home/d3r1n/Desktop/Projects/AstroX/build/libs/raylib/src/external/glfw/src /home/d3r1n/Desktop/Projects/AstroX/build/libs/raylib/src/external/glfw/src/CMakeFiles/glfw_objlib.dir/DependInfo.cmake --color=
Dependencies file "libs/raylib/src/external/glfw/src/CMakeFiles/glfw_objlib.dir/context.c.o.d" is newer than depends file "/home/d3r1n/Desktop/Projects/AstroX/build/libs/raylib/src/external/glfw/src/CMakeFiles/glfw_objlib.dir/compiler_depend.internal".
Dependencies file "libs/raylib/src/external/glfw/src/CMakeFiles/glfw_objlib.dir/egl_context.c.o.d" is newer than depends file "/home/d3r1n/Desktop/Projects/AstroX/build/libs/raylib/src/external/glfw/src/CMakeFiles/glfw_objlib.dir/compiler_depend.internal".
Dependencies file "libs/raylib/src/external/glfw/src/CMakeFiles/glfw_objlib.dir/glx_context.c.o.d" is newer than depends file "/home/d3r1n/Desktop/Projects/AstroX/build/libs/raylib/src/external/glfw/src/CMakeFiles/glfw_objlib.dir/compiler_depend.internal".
Dependencies file "libs/raylib/src/external/glfw/src/CMakeFiles/glfw_objlib.dir/init.c.o.d" is newer than depends file "/home/d3r1n/Desktop/Projects/AstroX/build/libs/raylib/src/external/glfw/src/CMakeFiles/glfw_objlib.dir/compiler_depend.internal".
Dependencies file "libs/raylib/src/external/glfw/src/CMakeFiles/glfw_objlib.dir/input.c.o.d" is newer than depends file "/home/d3r1n/Desktop/Projects/AstroX/build/libs/raylib/src/external/glfw/src/CMakeFiles/glfw_objlib.dir/compiler_depend.internal".
Dependencies file "libs/raylib/src/external/glfw/src/CMakeFiles/glfw_objlib.dir/linux_joystick.c.o.d" is newer than depends file "/home/d3r1n/Desktop/Projects/AstroX/build/libs/raylib/src/external/glfw/src/CMakeFiles/glfw_objlib.dir/compiler_depend.internal".
Dependencies file "libs/raylib/src/external/glfw/src/CMakeFiles/glfw_objlib.dir/monitor.c.o.d" is newer than depends file "/home/d3r1n/Desktop/Projects/AstroX/build/libs/raylib/src/external/glfw/src/CMakeFiles/glfw_objlib.dir/compiler_depend.internal".
Dependencies file "libs/raylib/src/external/glfw/src/CMakeFiles/glfw_objlib.dir/osmesa_context.c.o.d" is newer than depends file "/home/d3r1n/Desktop/Projects/AstroX/build/libs/raylib/src/external/glfw/src/CMakeFiles/glfw_objlib.dir/compiler_depend.internal".
Dependencies file "libs/raylib/src/external/glfw/src/CMakeFiles/glfw_objlib.dir/posix_thread.c.o.d" is newer than depends file "/home/d3r1n/Desktop/Projects/AstroX/build/libs/raylib/src/external/glfw/src/CMakeFiles/glfw_objlib.dir/compiler_depend.internal".
Dependencies file "libs/raylib/src/external/glfw/src/CMakeFiles/glfw_objlib.dir/posix_time.c.o.d" is newer than depends file "/home/d3r1n/Desktop/Projects/AstroX/build/libs/raylib/src/external/glfw/src/CMakeFiles/glfw_objlib.dir/compiler_depend.internal".
Dependencies file "libs/raylib/src/external/glfw/src/CMakeFiles/glfw_objlib.dir/vulkan.c.o.d" is newer than depends file "/home/d3r1n/Desktop/Projects/AstroX/build/libs/raylib/src/external/glfw/src/CMakeFiles/glfw_objlib.dir/compiler_depend.internal".
Dependencies file "libs/raylib/src/external/glfw/src/CMakeFiles/glfw_objlib.dir/window.c.o.d" is newer than depends file "/home/d3r1n/Desktop/Projects/AstroX/build/libs/raylib/src/external/glfw/src/CMakeFiles/glfw_objlib.dir/compiler_depend.internal".
Dependencies file "libs/raylib/src/external/glfw/src/CMakeFiles/glfw_objlib.dir/x11_init.c.o.d" is newer than depends file "/home/d3r1n/Desktop/Projects/AstroX/build/libs/raylib/src/external/glfw/src/CMakeFiles/glfw_objlib.dir/compiler_depend.internal".
Dependencies file "libs/raylib/src/external/glfw/src/CMakeFiles/glfw_objlib.dir/x11_monitor.c.o.d" is newer than depends file "/home/d3r1n/Desktop/Projects/AstroX/build/libs/raylib/src/external/glfw/src/CMakeFiles/glfw_objlib.dir/compiler_depend.internal".
Dependencies file "libs/raylib/src/external/glfw/src/CMakeFiles/glfw_objlib.dir/x11_window.c.o.d" is newer than depends file "/home/d3r1n/Desktop/Projects/AstroX/build/libs/raylib/src/external/glfw/src/CMakeFiles/glfw_objlib.dir/compiler_depend.internal".
Dependencies file "libs/raylib/src/external/glfw/src/CMakeFiles/glfw_objlib.dir/xkb_unicode.c.o.d" is newer than depends file "/home/d3r1n/Desktop/Projects/AstroX/build/libs/raylib/src/external/glfw/src/CMakeFiles/glfw_objlib.dir/compiler_depend.internal".
Consolidate compiler generated dependencies of target glfw_objlib
make[2]: Leaving directory '/home/d3r1n/Desktop/Projects/AstroX/build'
/usr/bin/make  -f libs/raylib/src/external/glfw/src/CMakeFiles/glfw_objlib.dir/build.make libs/raylib/src/external/glfw/src/CMakeFiles/glfw_objlib.dir/build
make[2]: Entering directory '/home/d3r1n/Desktop/Projects/AstroX/build'
make[2]: Nothing to be done for 'libs/raylib/src/external/glfw/src/CMakeFiles/glfw_objlib.dir/build'.
make[2]: Leaving directory '/home/d3r1n/Desktop/Projects/AstroX/build'
[ 55%] Built target glfw_objlib
/usr/bin/make  -f libs/raylib/src/external/glfw/src/CMakeFiles/glfw.dir/build.make libs/raylib/src/external/glfw/src/CMakeFiles/glfw.dir/depend
make[2]: Entering directory '/home/d3r1n/Desktop/Projects/AstroX/build'
cd /home/d3r1n/Desktop/Projects/AstroX/build && /usr/bin/cmake -E cmake_depends "Unix Makefiles" /home/d3r1n/Desktop/Projects/AstroX /home/d3r1n/Desktop/Projects/AstroX/libs/raylib/src/external/glfw/src /home/d3r1n/Desktop/Projects/AstroX/build /home/d3r1n/Desktop/Projects/AstroX/build/libs/raylib/src/external/glfw/src /home/d3r1n/Desktop/Projects/AstroX/build/libs/raylib/src/external/glfw/src/CMakeFiles/glfw.dir/DependInfo.cmake --color=
make[2]: Leaving directory '/home/d3r1n/Desktop/Projects/AstroX/build'
/usr/bin/make  -f libs/raylib/src/external/glfw/src/CMakeFiles/glfw.dir/build.make libs/raylib/src/external/glfw/src/CMakeFiles/glfw.dir/build
make[2]: Entering directory '/home/d3r1n/Desktop/Projects/AstroX/build'
make[2]: Nothing to be done for 'libs/raylib/src/external/glfw/src/CMakeFiles/glfw.dir/build'.
make[2]: Leaving directory '/home/d3r1n/Desktop/Projects/AstroX/build'
[ 58%] Built target glfw
/usr/bin/make  -f CMakeFiles/custom_button.dir/build.make CMakeFiles/custom_button.dir/depend
make[2]: Entering directory '/home/d3r1n/Desktop/Projects/AstroX/build'
cd /home/d3r1n/Desktop/Projects/AstroX/build && /usr/bin/cmake -E cmake_depends "Unix Makefiles" /home/d3r1n/Desktop/Projects/AstroX /home/d3r1n/Desktop/Projects/AstroX /home/d3r1n/Desktop/Projects/AstroX/build /home/d3r1n/Desktop/Projects/AstroX/build /home/d3r1n/Desktop/Projects/AstroX/build/CMakeFiles/custom_button.dir/DependInfo.cmake --color=
Dependencies file "CMakeFiles/custom_button.dir/src/custom_button.cpp.o.d" is newer than depends file "/home/d3r1n/Desktop/Projects/AstroX/build/CMakeFiles/custom_button.dir/compiler_depend.internal".
Consolidate compiler generated dependencies of target custom_button
make[2]: Leaving directory '/home/d3r1n/Desktop/Projects/AstroX/build'
/usr/bin/make  -f CMakeFiles/custom_button.dir/build.make CMakeFiles/custom_button.dir/build
make[2]: Entering directory '/home/d3r1n/Desktop/Projects/AstroX/build'
make[2]: Nothing to be done for 'CMakeFiles/custom_button.dir/build'.
make[2]: Leaving directory '/home/d3r1n/Desktop/Projects/AstroX/build'
[ 65%] Built target custom_button
/usr/bin/make  -f libs/raylib/src/CMakeFiles/raylib_static.dir/build.make libs/raylib/src/CMakeFiles/raylib_static.dir/depend
make[2]: Entering directory '/home/d3r1n/Desktop/Projects/AstroX/build'
cd /home/d3r1n/Desktop/Projects/AstroX/build && /usr/bin/cmake -E cmake_depends "Unix Makefiles" /home/d3r1n/Desktop/Projects/AstroX /home/d3r1n/Desktop/Projects/AstroX/libs/raylib/src /home/d3r1n/Desktop/Projects/AstroX/build /home/d3r1n/Desktop/Projects/AstroX/build/libs/raylib/src /home/d3r1n/Desktop/Projects/AstroX/build/libs/raylib/src/CMakeFiles/raylib_static.dir/DependInfo.cmake --color=
Dependencies file "libs/raylib/src/CMakeFiles/raylib_static.dir/core.c.o.d" is newer than depends file "/home/d3r1n/Desktop/Projects/AstroX/build/libs/raylib/src/CMakeFiles/raylib_static.dir/compiler_depend.internal".
Dependencies file "libs/raylib/src/CMakeFiles/raylib_static.dir/models.c.o.d" is newer than depends file "/home/d3r1n/Desktop/Projects/AstroX/build/libs/raylib/src/CMakeFiles/raylib_static.dir/compiler_depend.internal".
Dependencies file "libs/raylib/src/CMakeFiles/raylib_static.dir/raudio.c.o.d" is newer than depends file "/home/d3r1n/Desktop/Projects/AstroX/build/libs/raylib/src/CMakeFiles/raylib_static.dir/compiler_depend.internal".
Dependencies file "libs/raylib/src/CMakeFiles/raylib_static.dir/shapes.c.o.d" is newer than depends file "/home/d3r1n/Desktop/Projects/AstroX/build/libs/raylib/src/CMakeFiles/raylib_static.dir/compiler_depend.internal".
Dependencies file "libs/raylib/src/CMakeFiles/raylib_static.dir/text.c.o.d" is newer than depends file "/home/d3r1n/Desktop/Projects/AstroX/build/libs/raylib/src/CMakeFiles/raylib_static.dir/compiler_depend.internal".
Dependencies file "libs/raylib/src/CMakeFiles/raylib_static.dir/textures.c.o.d" is newer than depends file "/home/d3r1n/Desktop/Projects/AstroX/build/libs/raylib/src/CMakeFiles/raylib_static.dir/compiler_depend.internal".
Dependencies file "libs/raylib/src/CMakeFiles/raylib_static.dir/utils.c.o.d" is newer than depends file "/home/d3r1n/Desktop/Projects/AstroX/build/libs/raylib/src/CMakeFiles/raylib_static.dir/compiler_depend.internal".
Consolidate compiler generated dependencies of target raylib_static
make[2]: Leaving directory '/home/d3r1n/Desktop/Projects/AstroX/build'
/usr/bin/make  -f libs/raylib/src/CMakeFiles/raylib_static.dir/build.make libs/raylib/src/CMakeFiles/raylib_static.dir/build
make[2]: Entering directory '/home/d3r1n/Desktop/Projects/AstroX/build'
make[2]: Nothing to be done for 'libs/raylib/src/CMakeFiles/raylib_static.dir/build'.
make[2]: Leaving directory '/home/d3r1n/Desktop/Projects/AstroX/build'
[ 93%] Built target raylib_static
/usr/bin/make  -f CMakeFiles/AstroX.dir/build.make CMakeFiles/AstroX.dir/depend
make[2]: Entering directory '/home/d3r1n/Desktop/Projects/AstroX/build'
cd /home/d3r1n/Desktop/Projects/AstroX/build && /usr/bin/cmake -E cmake_depends "Unix Makefiles" /home/d3r1n/Desktop/Projects/AstroX /home/d3r1n/Desktop/Projects/AstroX /home/d3r1n/Desktop/Projects/AstroX/build /home/d3r1n/Desktop/Projects/AstroX/build /home/d3r1n/Desktop/Projects/AstroX/build/CMakeFiles/AstroX.dir/DependInfo.cmake --color=
Dependencies file "CMakeFiles/AstroX.dir/src/main.cpp.o.d" is newer than depends file "/home/d3r1n/Desktop/Projects/AstroX/build/CMakeFiles/AstroX.dir/compiler_depend.internal".
Consolidate compiler generated dependencies of target AstroX
make[2]: Leaving directory '/home/d3r1n/Desktop/Projects/AstroX/build'
/usr/bin/make  -f CMakeFiles/AstroX.dir/build.make CMakeFiles/AstroX.dir/build
make[2]: Entering directory '/home/d3r1n/Desktop/Projects/AstroX/build'
[ 96%] Linking CXX executable AstroX
/usr/bin/cmake -E cmake_link_script CMakeFiles/AstroX.dir/link.txt --verbose=1
/usr/bin/c   -O3 -DNDEBUG -rdynamic CMakeFiles/AstroX.dir/src/main.cpp.o -o AstroX  libcustom_button.a libs/raylib/src/libraylib.a libs/raylib/src/external/glfw/src/libglfw3.a -lrt -lm -ldl -lX11 -lpthread -lm -lpthread -lGL -lGLU 
/usr/bin/ld: CMakeFiles/AstroX.dir/src/main.cpp.o: in function `_GLOBAL__sub_I_main':
main.cpp:(.text.startup 0xaca): undefined reference to `CustomButton::CustomButton(Vector2, float, Texture2D, char const*, int, Color)'
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/AstroX.dir/build.make:105: AstroX] Error 1
make[2]: Leaving directory '/home/d3r1n/Desktop/Projects/AstroX/build'
make[1]: *** [CMakeFiles/Makefile2:153: CMakeFiles/AstroX.dir/all] Error 2
make[1]: Leaving directory '/home/d3r1n/Desktop/Projects/AstroX/build'
make: *** [Makefile:156: all] Error 2

CodePudding user response:

Ok I solved it via adding:

target_link_libraries(custom_button PRIVATE raylib)

to the CMakeLists.txt

  • Related