Jump to content

Erro desconhecido LNK2005 (pelo que entendi tem haver com uma das minhas librarias "lab.h")


light_Show_#55
Go to solution Solved by M6,

Recommended Posts

light_Show_#55

Olá boa tartde eu estou a fazer um jogo para entregar para a cadeira de lab mas eu fiquei preso com este erro se  alguem poder ajudar eu agredecia .

 

Erros:

Build started...
1>------ Build started: Project: Atirar, Configuration: Debug Win32 ------
1>Atirar.cpp
1>Tabuleiro.cpp
1>Generating Code...
1>Tabuleiro.obj : error LNK2005: "void __cdecl gotoxy(int,int)" (?gotoxy@@YAXHH@Z) already defined in Atirar.obj
1>Tabuleiro.obj : error LNK2005: "void __cdecl printAscii(int,int,int)" (?printAscii@@YAXHHH@Z) already defined in Atirar.obj
1>Tabuleiro.obj : error LNK2005: "void __cdecl printfAt(int,int,char * const)" (?printfAt@@YAXHHQAD@Z) already defined in Atirar.obj
1>Tabuleiro.obj : error LNK2005: "void __cdecl resetColor(void)" (?resetColor@@YAXXZ) already defined in Atirar.obj
1>Tabuleiro.obj : error LNK2005: "void __cdecl setBackColor(int)" (?setBackColor@@YAXH@Z) already defined in Atirar.obj
1>Tabuleiro.obj : error LNK2005: "void __cdecl setColor(int,int)" (?setColor@@YAXHH@Z) already defined in Atirar.obj
1>Tabuleiro.obj : error LNK2005: "void __cdecl setForeColor(int)" (?setForeColor@@YAXH@Z) already defined in Atirar.obj
1>Tabuleiro.obj : error LNK2005: "void __cdecl show90RectAt(int,int,int,int)" (?show90RectAt@@YAXHHHH@Z) already defined in Atirar.obj
1>Tabuleiro.obj : error LNK2005: "void __cdecl showCharAt(int,int,char)" (?showCharAt@@YAXHHD@Z) already defined in Atirar.obj
1>Tabuleiro.obj : error LNK2005: "void __cdecl showRectAt(int,int,int,int)" (?showRectAt@@YAXHHHH@Z) already defined in Atirar.obj
1>Tabuleiro.obj : error LNK2005: "void __cdecl showVerticalWordAt(int,int,char * const,int)" (?showVerticalWordAt@@YAXHHQADH@Z) already defined in Atirar.obj
1>C:\Users\josep\source\repos\Atirar\Debug\Atirar.exe : fatal error LNK1169: one or more multiply defined symbols found
1>Done building project "Atirar.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

 

 

 

Atirar.cpp:

#include <windows.h>
#include <mmsystem.h>
#include <iostream>
#include <conio.h>
#include <ctime>
#include <iterator>
#include <stdlib.h>
#include <array>
#include <algorithm>
#include "Barco.h"
#include "Tabuleiro.h"
#include "lab.h"

using namespace std;

//variaveis globais
int opcao=0;

//---------------



void menu() 
{


    system("cls");

    showRectAt(20, 1, 100, 25);
    gotoxy(25, 5);
    cout << " ____            _             _   _                 _   _                           _   ";
    gotoxy(25, 6);
    cout << "|    \\          | |           | | | |               | \\ | |                         | |";
    gotoxy(25, 7);
    cout << "| |_) |   __ _  | |_    __ _  | | | |__     __ _    |  \\| |   __ _  __   __   __ _  | |  ";
    gotoxy(25, 8);
    cout << "|  _ <   / _` | | __|  / _` | | | | '_ \\   / _` |   | . ` |  / _` | \\ \\ / /  / _` | | |";
    gotoxy(25, 9);
    cout << "| |_) | | (_| | | |_  | (_| | | | | | | | | (_| |   | |\\  | | (_| |  \\ V /  | (_| | | |";
    gotoxy(25, 10);
    cout << "|____/   \\__,_|  \\__|  \\__,_| |_| |_| |_|  \\__,_|   |_| \\_|  \\__,_|   \\_/    \\__,_| |_|";
    gotoxy(55, 15);
    cout << "_________________________________" << endl;
    gotoxy(60, 16);
    cout << "                                     " << endl;
    gotoxy(66, 17);
    cout << "Jogar" << endl;
    gotoxy(66, 18);
    cout << "Carregar Jogo" << endl;
    gotoxy(66, 19);
    cout << "Regras" << endl;
    gotoxy(66, 20);
    cout << "Sair" << endl;
    gotoxy(50, 27);
    cout << "Desenvolvido Por Ricardo Inacio & Jose Alves 2021" << endl;




    if (opcao == 1) 
    {
        gotoxy(66, 17);
        setColor(1, 15);
        printf("-> Jogar\n");
        setColor(15, 0);
    }
    else if (opcao == 2) 
    {
        gotoxy(66, 18);
        setColor(1, 15);
        printf("-> Carregar Jogo.\n");
        setColor(15, 0);
    }
    else if (opcao == 3)
    {
        gotoxy(66, 19);
        setColor(1, 15);
        printf("-> Regras.\n");
        setColor(15, 0);
    }
    else if (opcao == 4)
    {
        gotoxy(66, 20);
        setColor(1, 15);
        printf("-> Sair.\n");
        setColor(15, 0);
    }

}

bool checkCords(int x, int y, int cords[4][2], int pos)
{
    bool exists = false;
    for (int i = 0; i < 4; i++)
    {
        if (i == pos) 
        {
            continue;
        }
        else 
        {
            if (x == cords[i][0] && y == cords[i][1])
            {
                exists = true;
            }
        }
    }
    return exists;
}

void DrawBoards(int scx[4], int scy[4])
{
    int i;
    int cli[4];
    char cl[4];
    int cn[4];
    char letras[10] = { 'a','b','c','d','e','f','g','h','i','j' };
    int savedc[4][2];


    Tabuleiro t1, t2;

    for (i = 0; i < 4; i++)
    {
        t2.setCell(scx[i], scy[i], 'O');
    }

    gotoxy(75, 0);
    t2.Draw(75, 5);
    gotoxy(0, 0);
    t1.Draw(27, 5);

    gotoxy(26, 3);
    cout << "JOGADOR";
    gotoxy(110, 3);
    cout << "COMPUTADOR";
    showRectAt(25, 4, 48, 24);
    showRectAt(73, 4, 48, 24);

    show90RectAt(25, 30, 10, 48);

    for (i = 0; i < 4; i++) 
    {
        gotoxy(26, 31);
        cout << "Insira o " << i + 1 << " numero a colocar :     " << endl; ;
        gotoxy(58, 31);
        do 
        {
            cin >> cn[i];
            if (cn[i] < 1 || cn[i] > 10) 
            {
                gotoxy(26, 31);
                cout << "                                              ";
                gotoxy(26, 31);
                cout << "Insira o " << i + 1 << " numero a colocar :     " << endl; ;
                gotoxy(26, 33);
                cout << "O numero tem de estar contido entre 1 e 10!";
                gotoxy(58, 31);
            }
        } while (cn[i] < 1 || cn[i] > 10);
        savedc[i][0] = cn[i];
        gotoxy(26, 33);
        cout << "                                              ";
        cout << endl;
        gotoxy(26, 31);
        cout << "Insira a " << i + 1 << " letra a colocar :      " << endl;
        gotoxy(58, 31);
        do
        {
            cin >> cl[i];
            if (!strchr(letras, cl[i]))
            {
                gotoxy(26, 31);
                cout << "                                              ";
                gotoxy(26, 31);
                cout << "Insira a " << i + 1 << " letra a colocar :     " << endl; ;
                gotoxy(26, 33);
                cout << "A letra tem de estar contida entre A e J!";
                gotoxy(58, 31);
            }
        } while (!strchr(letras, cl[i]));
        cli[i] = int(cl[i] - 96);
        savedc[i][1] = cli[i];
        gotoxy(26, 33);
        cout << "                                              ";
        cout << endl;

        //verificar se ponto de cordenadas ja existe
        bool check = checkCords(cn[i], cli[i], savedc, i);
        while (check) 
        {
            gotoxy(26, 31);
            cout << "Insira o " << i + 1 << " numero a colocar :     " << endl;
            gotoxy(26, 33);
            cout << "Esse ponto de cordenadas ja existe!";
            gotoxy(58, 31);
            do {
                cin >> cn[i];
                if (cn[i] < 1 || cn[i] > 10)
                {
                    gotoxy(26, 31);
                    cout << "                                              ";
                    gotoxy(26, 31);
                    cout << "Insira o " << i + 1 << " numero a colocar :     " << endl; ;
                    gotoxy(26, 33);
                    cout << "O numero tem de estar contido entre 1 e 10!";
                    gotoxy(58, 31);
                }
            } while (cn[i] < 1 || cn[i] > 10);
            gotoxy(26, 33);
            cout << "                                              ";
            cout << endl;
            gotoxy(26, 31);
            cout << "Insira a " << i + 1 << " letra a colocar :      " << endl;
            gotoxy(58, 31);
            do
            {
                cin >> cl[i];
                if (!strchr(letras, cl[i]))
                {
                    gotoxy(26, 31);
                    cout << "                                              ";
                    gotoxy(26, 31);
                    cout << "Insira a " << i + 1 << " letra a colocar :     " << endl; ;
                    gotoxy(26, 33);
                    cout << "A letra tem de estar contida entre A e J!";
                    gotoxy(58, 31);
                }
            } while (!strchr(letras, cl[i]));
            gotoxy(26, 33);
            cout << "                                              ";
            cout << endl;
            check = checkCords(cn[i], cli[i], savedc, i);
        }
        savedc[i][0] = cn[i];
        cli[i] = int(cl[i] - 96);
        savedc[i][1] = cli[i];
    }


    for (i = 0; i < 4; i++)
    {
        t1.setCell(cn[i], int(cl[i]) - 96, 'O');
    }

    system("cls");

    gotoxy(75, 0);
    t2.Draw(75, 5);
    gotoxy(0, 0);
    t1.Draw(27, 5);

    gotoxy(26, 3);
    cout << "JOGADOR";
    gotoxy(110, 3);
    cout << "COMPUTADOR";
    showRectAt(25, 4, 48, 24);
    showRectAt(73, 4, 48, 24);
    //    for(i=0; i<4; i++) {
    //        cout << endl;
    //        cout << "CORDS: (" << savedc[i][0] << "," << savedc[i][1] << "=" << cl[i] << ")" << endl;
    //        t1.setCell(cn[i],int(cl[i])-96,'O');
    //    }

}

void gerarBarcos() {
    int x0, y0, dx, dy, i=0;
    x0 = 5;
    y0 = 4;
    dx = 10;
    dy = 10;

    Barco sub1, sub2, sub3, sub4;

    sub1.generateSub(1);
    sub2.generateSub(2);
    sub3.generateSub(3);
    sub4.generateSub(4);

    int sub_cordsx[4] = { sub1.get_subx(),sub2.get_subx(),sub3.get_subx(),sub4.get_subx() };
    int sub_cordsy[4] = { sub1.get_suby(),sub2.get_suby(),sub3.get_suby(),sub4.get_suby() };

    //    cout << "DEBUG-----------------------" << endl;
    //    for(i=0;i<4;i++){
    //         cout << "Cords: (" << sub_cordsx[i] << "," << char(64 + sub_cordsy[i]) << ")" << endl;
    //    }
    //
    //    cout << "----------------------------" << endl;


    DrawBoards(sub_cordsx, sub_cordsy);
}

void game() {
    system("cls");
    //backgorund music
    //PlaySound(TEXT("bg.wav"), NULL, SND_FILENAME | SND_ASYNC);
    HWND hWnd = GetConsoleWindow();
    ShowWindow(hWnd, SW_SHOWMAXIMIZED);
    gerarBarcos();

}


int main() {
    int op;
    opcao = 1;

    do
    {

        menu();
        op = _getch();

        if (op == 80) 
        {
            opcao++;
        }
        if (op == 72)
        {
            opcao--;
        }
        if (opcao > 4) 
        {
            opcao = 1;
        }

        if (opcao < 1)
        {
            opcao = 4;
        }

    } while (op != 13);

    switch (opcao) 
    {
        case 1:
            game();
            break;
        case 2:
            //loadgame();
            break;
        case 3:
            //rules();
            break;
        case 4:
            exit(0);
            break;

    }



    //SimbolBoxList();


    //cin.get();
    return 0;
}

 

Tabuleiro.h:

#pragma once
#include "PontoNaval.h"

class Tabuleiro
{
    private:
        int dimx;
        int dimy;
        char M[10][10];
    public:
        Tabuleiro();
        Tabuleiro(int mdx, int mdy);
        virtual ~Tabuleiro();

        void setDimX(int mdx) {
            dimx = mdx;
        }

        void setDimY(int mdy) {
            dimy = mdy;
        }

        int getDimX() {
            return dimx;
        }

        int getDimY() {
            return dimy;
        }

        void setCell(int l, int col, char c) {
            M[l - 1][col - 1] = c;
        }

        char getCell(int l, int col) {
            return M[l - 1][col - 1];
        }

        void setCell(PontoNaval P, char c) {
            M[P.Getx() - 1][P.Getinty() - 1] = c;
        }

        char getCell(PontoNaval P) {
            return M[P.Getx() - 1][P.Getinty() - 1];
        }

        void SimbolBoxList();

        void DrawFirstLine(int x0, int dxcel);

        void DrawMiddleLine(int x0, int dxcel);

        void DrawDataLine(int line, int x0, int dxcel);

        void DrawLastLine(int x0, int dxcel);

        void Draw(int x0, int y0);

};

 

 

tabuleiro.cpp:

 

#include <iostream>
#include "Tabuleiro.h"
#include "lab.h"

using namespace std;

Tabuleiro::Tabuleiro() {
    int i, j;
    setDimX(10);
    setDimY(10);

    for (i = 1; i <= getDimY(); i++) {
        for (j = 1; j <= getDimX(); j++) {
            setCell(i, j, '.');
        }
    }

}

Tabuleiro::Tabuleiro(int mdx, int mdy) 
{
    int i, j;
    setDimX(mdx);
    setDimY(mdy);

    for (i = 1; i < getDimY(); i++) {
        for (j = 1; j <= getDimX(); j++) {
            setCell(i, j, '.');
        }
    }
}

Tabuleiro::~Tabuleiro()
{

}

void Tabuleiro::SimbolBoxList() {
    cout << endl << endl;
    cout << "tabela ASCII e Extendida para as box";
    cout << endl << endl;

    int tabela[] = {
        185,186,187,188,200,201,202,203,204,206,
        191,192,217,218,179,196,193,194,195,197,221,180,
        45,47,60,62,88,91,92,93,94,95,238,240,
        30,31,176,177,178,219,220,223,254,
        59,123,124,125,143,205,189,190,207,241,242,245,249,46,58,61,127,174,175,145
    };
    int j = 0;


    for (int i = 0; i < 62; i++) {
        cout << tabela[i] << '\t' << (char)tabela[i] << '\t';
        j++;
        if (j == 5) {
            cout << endl << endl;
            j = 0;
        }
    }

}

void Tabuleiro::DrawFirstLine(int x0, int dxcel) {
    int i, j;

    for (i = 0; i < x0 + 2; i++) {
        cout << " ";
    }

    cout << char(218);
    for (i = 0; i < getDimX(); i++) {
        for (j = 0; j < dxcel; j++) {
            cout << char(196);

        }
        if (i < getDimX() - 1) {
            cout << char(194);
        }

    }

    cout << char(191);
}

void Tabuleiro::DrawMiddleLine(int x0, int dxcel) {
    int i, j;


    for (i = 0; i < x0 + 2; i++) {
        cout << " ";
    }
    cout << char(195);
    for (i = 0; i < getDimX(); i++) {
        for (j = 0; j < dxcel; j++) {
            setBackColor(1);
            cout << char(196);
            resetColor();
        }
        if (i < getDimX() - 1) {
            setBackColor(1);
            cout << char(197);
            resetColor();
        }

    }

    cout << char(180);
}

void Tabuleiro::DrawLastLine(int x0, int dxcel) {
    int i, j;

    for (i = 0; i < x0 + 2; i++) {
        cout << " ";
    }
    cout << char(192);
    for (i = 0; i < getDimX(); i++)
    {
        for (j = 0; j < dxcel; j++) {
            cout << char(196);

        }
        if (i < getDimX() - 1) {
            cout << char(192);
        }

    }

    cout << char(217);
}


void Tabuleiro::DrawDataLine(int line, int x0, int dxcel) {
    int i;

    for (i = 0; i < x0; i++) {
        cout << " ";
    }

    if (line > 9) {
        cout << line;
    }
    else {
        cout << line << " ";
    }

    for (i = 1; i <= getDimX(); i++) {
        setBackColor(1);
        cout << char(179);
        cout << " " << getCell(line, i) << " ";
        resetColor();
    }
    cout << char(179);

}

void Tabuleiro::Draw(int x0, int y0) {

    int i, l, dxtab, dytab, dxcel; // , dycel;
//	dycel = 1;
    dxcel = 3;
    dxtab = 4 * getDimX();
    dytab = 1 * getDimY();

    for (i = 0; i < y0; i++) 
    {
        cout << endl;
    }

    for (i = 0; i < x0 + 2; i++) 
    {
        cout << " ";
    }


    for (i = 0; i < getDimX(); i++) {
        cout << "  " << char(65 + i) << " ";
    }

    cout << endl;

    //Draw First Line
    DrawFirstLine(x0, dxcel);
    cout << endl;
    DrawDataLine(1, x0, dxcel);
    cout << endl;

    //Draw Middle Lines
    for (l = 2; l <= getDimY(); l++) {
        DrawMiddleLine(x0, dxcel);
        cout << endl;
        DrawDataLine(l, x0, dxcel);
        cout << endl;
    }


    //Draw Last Line
    DrawLastLine(x0, dxcel);
    cout << endl << endl;


}

 

Link to post
Share on other sites
  • Solution

Provavelmente tens alguma coisa num .h que é incluído várias vezes, fazendo com que uma definição tenhas nesse .h esteja definido várias vezes. Se assim for, e se for viável, podes colocar os valores estáticos por exemplo.

Podes também tentar forçar o link: https://docs.microsoft.com/en-us/cpp/error-messages/tool-errors/linker-tools-error-lnk1169?view=msvc-160

10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Link to post
Share on other sites
thoga31

As funções a que o compilador se refere estão definidas em lab.h?

Em caso afirmativo, diria de cabeça que talvez possas mover o #include “lab.h” do Tabuleiro.cpp para o Tabuleiro.h, e no Atirar.cpp incluir apenas o Tabuleiro.h, removendo a inclusão do lab.h.

Não sei se vai funcionar, esta sugestão é com base numa leitura rápida na diagonal do teu código.

Cumprimentos.

Knowledge is free!

Link to post
Share on other sites
light_Show_#55
7 minutos atrás, thoga31 disse:

As funções a que o compilador se refere estão definidas em lab.h?

Em caso afirmativo, diria de cabeça que talvez possas mover o #include “lab.h” do Tabuleiro.cpp para o Tabuleiro.h, e no Atirar.cpp incluir apenas o Tabuleiro.h, removendo a inclusão do lab.h.

Não sei se vai funcionar, esta sugestão é com base numa leitura rápida na diagonal do teu código.

Cumprimentos.

Consegui forçando o link ... Isso pode cousar erros futuros ou o que forçar o link faz ? (/FORCE)

Link to post
Share on other sites
thoga31

Há uma miríade de soluções para as várias causas do erro LNK2005: https://docs.microsoft.com/en-us/cpp/error-messages/tool-errors/linker-tools-error-lnk2005?view=msvc-160

Tanto é que o forçar o link é a última sugestão lá bem no fundo da página, e apenas é apresentada como solução para um caso muito particular.

Forçar o link neste caso parece-me ser potencialmente um remendo e não uma solução. Verdade seja dita, nem conhecia tal opção (não uso o Visual Studio): o que tento fazer sempre é corrigir a inclusão dos header files de forma a não duplicar declarações, ou limitar o scope de cada declaração (se aplicável).

Knowledge is free!

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.