SFML C++ ERROR: LNK 1169

Рейтинг: -3Ответов: 1Опубликовано: 25.03.2023

Main.cpp

#include <SFML/Graphics.hpp>
#include <iostream>
#include "menu.cpp"
using namespace std;
using namespace sf;
int page_number;

const int windowWidth = 800, windowHeight = 800;

int main()
{
    RenderWindow window(sf::VideoMode(windowWidth, windowHeight), "game");
    Menu menu(windowWidth, windowHeight - 250);
    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
            if (event.type == Event::KeyReleased)
            {
                switch (event.key.code)
                {
                case Keyboard::Up:
                    menu.moveUp();
                    break;
                case Keyboard::Down:
                    menu.moveDown();
                    break;
                }

                // Choose Page/Choice
                if (event.key.code == Keyboard::Enter)
                {

                    switch (menu.mainMenuPressed())
                    {
                    case 0:
                        window.close();
                        page_number = 0;
                        break;
                    case 1:
                        window.close();
                        page_number = 1;
                        break;
                    case 2:
                        window.close();
                        page_number = 2;
                        break;
                    }
                }
            }
        }

        window.clear();
        window.display();
    }
    return 0;
}

Menu.cpp

#include <SFML/Graphics.hpp>
#include "menu.h"
using namespace sf;

Menu::Menu(float width, float height)
{

    if (!font.loadFromFile("assets/font/CyrilicOld.ttf")) {}

    mainMenu[0].setFont(font);
    mainMenu[0].setFillColor(sf::Color::Green);
    mainMenu[0].setString("Play");
    mainMenu[0].setCharacterSize(40);
    mainMenu[0].setPosition(sf::Vector2f(width / 2 - 50, height / (Max_main_menu + 1)));

    mainMenu[1].setFont(font);
    mainMenu[1].setFillColor(sf::Color(123, 63, 0));
    mainMenu[1].setString("Options");
    mainMenu[1].setCharacterSize(40);
    mainMenu[1].setPosition(sf::Vector2f(width / 2 - 50, height / (Max_main_menu + 1) * 2));

    mainMenu[2].setFont(font);
    mainMenu[2].setFillColor(sf::Color(123, 63, 0));
    mainMenu[2].setString("Exit");
    mainMenu[2].setCharacterSize(40);
    mainMenu[2].setPosition(sf::Vector2f(width / 2 - 50, height / (Max_main_menu + 1) * 3));

    mainMenuSelected = 0;
}


Menu::~Menu()
{

}

// Draw Main Menu
void Menu::draw(sf::RenderWindow& window)
{
    for (int i = 0; i < 3; i++)
    {
        window.draw(mainMenu[i]);
    }
}

// Move Up
void Menu::moveUp()
{
    if (mainMenuSelected - 1 >= -1)
    {
        mainMenu[mainMenuSelected].setFillColor(sf::Color(123, 63, 0));

        mainMenuSelected--;
        if (mainMenuSelected == -1)
        {
            mainMenuSelected = 2;
        }
        mainMenu[mainMenuSelected].setFillColor(sf::Color::Green);
    }
}

// Move Down
void Menu::moveDown()
{
    if (mainMenuSelected + 1 <= Max_main_menu)
    {
        mainMenu[mainMenuSelected].setFillColor(sf::Color(123, 63, 0));

        mainMenuSelected++;
        if (mainMenuSelected == 3)
        {
            mainMenuSelected = 0;
        }
        mainMenu[mainMenuSelected].setFillColor(sf::Color::Green);
    }
}

menu.h

#pragma once
#define Max_main_menu 3

class Menu
{

public:
    Menu(float width, float height);

    void draw(sf::RenderWindow& window);
    void moveUp();
    void moveDown();

    int mainMenuPressed()
    {
        return mainMenuSelected;
    }

    ~Menu();

private:
    int mainMenuSelected;
    sf::Font font;
    sf::Text mainMenu[Max_main_menu];
};

Выдает ошибки:

Ошибка  LNK2005 
"public: void __cdecl Menu::draw(class sf::RenderWindow &)" 
(?draw@Menu@@QEAAXAEAVRenderWindow@sf@@@Z) уже определен в Main.obj 

Ошибка  LNK1169 
обнаружен многократно определенный символ - один или более  
    
Ошибка  LNK2005 
"public: __cdecl Menu::~Menu(void)" 
(??1Menu@@QEAA@XZ) уже определен в Main.obj 
    
Ошибка  LNK2005 
"public: __cdecl Menu::Menu(float,float)" 
(??0Menu@@QEAA@MM@Z) уже определен в Main.obj   

Ошибка  LNK2005 
"public: void __cdecl Menu::moveUp(void)" 
(?moveUp@Menu@@QEAAXXZ) уже определен в Main.obj        

Ошибка  LNK2005 
"public: void __cdecl Menu::moveDown(void)" 
(?moveDown@Menu@@QEAAXXZ) уже определен в Main.obj      

Пожалуйста помогите

Ответы

▲ 1

При компиляции Main.cpp из-за строки

#include "menu.cpp"

все функции из menu.cpp оказываются скомпилированными дважды - в main.obj и в menu.obj. Вот линковщик и не знает, какую функцию выбрать, из какого файла.

Не включайте один файл реализации в другой, только заголовочный файл с объявениями функций, но не с их определениями. Или тогда делайте их все inline.