Help pls :( -1: linker command failed with exit code 1 (use -v to see invocation)

Hi, im do this code and i have this error. send help plis 😟 I do not know why happen. This error has appeared before me but I do not know what it means or why it happens to me, if someone can solve these doubts, I would be very grateful.


ERROR:

Ld /Users/robertomanguezmartin/Library/Developer/Xcode/DerivedData/ENT_4-gofrayijplkjfxgysxvmiedjptwq/Build/Products/Debug/ENT_4 normal x86_64 (in target: ENT_4)

cd /Users/robertomanguezmartin/Documents/UNI_UC3M/ENT_4

export MACOSX_DEPLOYMENT_TARGET=10.14

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk -L/Users/robertomanguezmartin/Library/Developer/Xcode/DerivedData/ENT_4-gofrayijplkjfxgysxvmiedjptwq/Build/Products/Debug -F/Users/robertomanguezmartin/Library/Developer/Xcode/DerivedData/ENT_4-gofrayijplkjfxgysxvmiedjptwq/Build/Products/Debug -filelist /Users/robertomanguezmartin/Library/Developer/Xcode/DerivedData/ENT_4-gofrayijplkjfxgysxvmiedjptwq/Build/Intermediates.noindex/ENT_4.build/Debug/ENT_4.build/Objects-normal/x86_64/ENT_4.LinkFileList -mmacosx-version-min=10.14 -Xlinker -object_path_lto -Xlinker /Users/robertomanguezmartin/Library/Developer/Xcode/DerivedData/ENT_4-gofrayijplkjfxgysxvmiedjptwq/Build/Intermediates.noindex/ENT_4.build/Debug/ENT_4.build/Objects-normal/x86_64/ENT_4_lto.o -Xlinker -export_dynamic -Xlinker -no_deduplicate -Xlinker -dependency_info -Xlinker /Users/robertomanguezmartin/Library/Developer/Xcode/DerivedData/ENT_4-gofrayijplkjfxgysxvmiedjptwq/Build/Intermediates.noindex/ENT_4.build/Debug/ENT_4.build/Objects-normal/x86_64/ENT_4_dependency_info.dat -o /Users/robertomanguezmartin/Library/Developer/Xcode/DerivedData/ENT_4-gofrayijplkjfxgysxvmiedjptwq/Build/Products/Debug/ENT_4


Undefined symbols for architecture x86_64:

"_stdscr", referenced from:

_main in main.o

_menu in main.o

"_wgetch", referenced from:

_main in main.o

_menu in main.o

ld: symbol(s) not found for architecture x86_64

clang: error: linker command failed with exit code 1 (use -v to see invocation)


CODE:


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <curses.h>
#include <string.h>

#define FILAS 6
#define COLUMNAS 7
#define RAYAS 4
#define MAXIMO 1
#define MAX_PARTIDAS 3

struct partida
{
    char ficha_comienzo;
    int fichas;
    int ganador;
    int secuencia[FILAS*COLUMNAS];
};
void titulo(void);
char menu(void);
void creartablero(char [][COLUMNAS]);
int numeromenos45(char [][COLUMNAS],int [][3]);
int numero45(char [][COLUMNAS],int [][3],int);
int numerov(char [][COLUMNAS],int[][3],int);
int numeroh(char [][COLUMNAS],int[][3],int);
void juego(char [][COLUMNAS], struct partida [ ], int);


int main()
{
    int i,j,k;
    char tablero[FILAS][COLUMNAS];
    int x=0;
    char opcionmenu;
    struct partida p[MAX_PARTIDAS];
    
    //Generar título
    titulo();
    
    
    //Rellenar tablero de espacios
    for(i=0;i<FILAS;i++)
    {
        for(j=0;j<COLUMNAS;j++)
        {
            tablero[i][j]=' ';
        }
    }
    
    for(k=0;k<MAX_PARTIDAS && x!=1;k++)
    {
        opcionmenu=menu();
        
        switch(opcionmenu)
        {
            case '1':
                printf("Elige la ficha con la que comenzara el jugador 1: \n\n - x \n - o\n");
                p[k].ficha_comienzo=getch();
                while(p[k].ficha_comienzo!='x' && p[k].ficha_comienzo!='o')
                {
                    printf("\nIntroduce una opcion valida. \n\n - x \n - o\n");
                    p[k].ficha_comienzo=getch();
                }
                creartablero(tablero);
                juego(tablero, p,k);
                
                
                break;
            case '2':
                break;
            case '3':
                break;
            case '4':
                x=1;
        }
        if (k==MAX_PARTIDAS-1)
        {
            printf("Se ha alcanzado el maximo de partidas (%d)", MAX_PARTIDAS);
        }
    }
    
    
    
}

//Título función
void titulo()
{
    printf("╔");
    for(int i=0;i<28;i++)
    {
        printf("═");
    }
    printf("╗");
    
    printf("║ ENTREGABLE 4 - EJERCICIO 1 ║ \n");
    
    printf("╚");
    for(int i=0;i<28;i++)
    {
        printf("═");
    }
    printf("═ \n\n");
}

//Menú
char menu()
{
    char elegida;
    
    printf("Elige una de las siguientes opciones: \n\n1. Jugar partida \n2. Exportar partida \n3. Estadisticas \n4. Salir del programa \n");
    elegida=getch();
    while(elegida!='1' && elegida!='2' && elegida!='3' && elegida!='4')
    {
        printf("\nOpcion incorrecta.\n\n");
        printf("Elige una de las siguientes opciones: \n\n1. Jugar partida \n2. Exportar partida \n3. Estadisticas \n4. Salir del programa \n");
        elegida=getch();
    }
    return elegida;
}

//Generar el tablero
void creartablero(char tablero[][COLUMNAS])
{
    int i;
    int j;
    puts("");
    for(int n=0;n<COLUMNAS;n++)
    {
        printf(" %2d ",n+1);
    }
    
    printf("/n╔");
    for(int a=0;a<COLUMNAS-1;a++)
    {
        printf("═══╦");
    }
    printf("═══╗ /n");
    for(i=0; i<FILAS-1;i++)
    {
        for(j=0;j<COLUMNAS;j++)
        {
            printf("║ %c ", tablero[i][j]);
        }
        printf("║");
        printf("%d \n",i+1);
        printf("╠");
        for(int a=0;a<COLUMNAS-1;a++)
        {
            printf("═══╬");
        }
        printf("═══╣ /n");
    }
    
    for(int j=0;j<COLUMNAS;j++)
    {
        printf("║ %c ",tablero[FILAS-1][j]);
    }
    printf("║");
    printf("%d \n",FILAS);
    printf("╚");
    for(int a=1;a<=COLUMNAS-1;a++)
    {
        printf("═══╩");
    }
    printf("═══╝ /n");
}

//Detectar y contar -45º
int numeromenos45(char cuadricula[][COLUMNAS],int posicion[][3])
{
    int counter=0; //Saber cuantas "O" consecutivaas hay.
    int maxcounter=0; //Saber cuantas rayas de -45º hay.
    int i,j,k;
    
    for(i=0;i<FILAS-RAYAS+1;i++)//A partir de la fila FILAS-RAYAS+1 es imposible que empiece una raya de -45º, por tanto, en esas no busca.
    {
        for(j=0;j<COLUMNAS-RAYAS+1;j++)//A partir de la columna COLUMNAS-RAYAS+1 es imposible que empiece una raya de -45º, por tanto, en esas no busca.
        {
            if(cuadricula[i][j]=='O')//Solo tomar en cuenta las rayas generadas por las "O"
            {
                if(j==0 || i==0) //Al estar en la primera fila o en la primera columna, no hay que verificar que el anterior sea distinto, pues en teoría no hay anterior.
                {
                    //Verificar que el elemento que se encuentra en la diagonal -45º (cuadricula[i+k+1][j+k+1]) sea una "O" también, y que no se haya alcanzado el numero maximo de rayas.
                    for(k=0;k<RAYAS-1 && cuadricula[i][j]==cuadricula[i+k+1][j+k+1] && maxcounter<MAXIMO;k++)
                    {
                        counter++;//Por cada "O" detectada a continuación de la inicial, sumamos 1 al contador de "O" consecutivas.
                    }
                    if(counter>=RAYAS-1)//Si hay RAYAS-1 "O" consecutivas o más después de la "O" detectada al principio, significa que hay una raya.
                    {
                        //Meter en la correspondiente fila del array "resumen" la info de la raya detectada.
                        posicion[maxcounter][0]=i+1;
                        posicion[maxcounter][1]=j+1;
                        posicion[maxcounter][2]=0; //Como es una raya de -45º, ponemos un 0 en la última columna para identificarla.
                        maxcounter++;//Se suma 1 al contador de rayas detectads.
                    }
                }
                else //En el resto de filas y columnas, comprobamos que el elemento que el elemento anterior no sea una "O", para evitar que cuente varias veces una misma raya.
                {
                    for(k=0;k<RAYAS-1 && cuadricula[i][j]==cuadricula[i+k+1][j+k+1] && cuadricula[i][j]!=cuadricula[i-1][j-1] && maxcounter<MAXIMO;k++)
                    {
                        counter++;
                    }
                    if(counter>=RAYAS-1)
                    {
                        posicion[maxcounter][0]=i+1;
                        posicion[maxcounter][1]=j+1;
                        posicion[maxcounter][2]=0;
                        maxcounter++;
                    }
                }
                counter=0; //Ponemos el contador de "O" consecutivas en 0 para que se repita el proceso.
            }
        }
    }
    return maxcounter;//Devolvemos el numero de rayas detectads.
}

//Detectar y contar 45º
int numero45(char cuadricula[][COLUMNAS], int posicion[][3], int total)//Esta vez se necesitará la variable total para saber en que parte del array "resumen" almacenar la info.
{
    int counter=0;
    int maxcounter=0;
    int i,j,k;
    
    for(i=RAYAS-1;i<FILAS;i++)//Lo mismo de antes, solo que ahora empieza desde la fila RAYAS-1, pues en las anteriores es imposible que empiece una raya de 45º
    {
        for(j=0;j<COLUMNAS-RAYAS+1;j++)//Igual que antes.
        {
            if(cuadricula[i][j]=='O')
            {
                if(j==0|| i==FILAS-1)//En la primera columna y en la última fila, no hay que verificar que el elemento anterior no sea una "O", pues en teoría no hay.
                {
                    //El elemento que está en diagonal de 45º es el cuadricula[i-k-1][j+k+1], y hay que verificar que el total de rayas detectadas sea menor que el máximo.
                    for(k=0;k<RAYAS-1 && cuadricula[i][j]==cuadricula[i-k-1][j+k+1] && maxcounter+total<MAXIMO;k++)
                    {
                        counter++;
                    }
                    if(counter>=RAYAS-1)
                    {
                        //Como las posiciones que van desde 0 hasta total-1 ya están ocupadas, empezará a almacenar a partir de la fila "total".
                        posicion[maxcounter+total][0]=i+1;
                        posicion[maxcounter+total][1]=j+1;
                        posicion[maxcounter+total][2]=1;//Lo mismo de antes, pero esta vez se pone un 1 en la última columna, para identificarla como una raya de 45º
                        maxcounter++;
                    }
                }
                else
                {
                    for(k=0;k<RAYAS-1 && cuadricula[i][j]==cuadricula[i-k-1][j+k+1] && cuadricula[i][j]!=cuadricula[i+1][j-1] && maxcounter+total<MAXIMO;k++)
                    {
                        counter++;
                    }
                    if(counter>=RAYAS-1)
                    {
                        posicion[maxcounter+total][0]=i+1;
                        posicion[maxcounter+total][1]=j+1;
                        posicion[maxcounter+total][2]=1;
                        maxcounter++;
                    }
                }
                counter=0;
            }
        }
    }
    return maxcounter;
}

//Detectar y contar Verticales
int numerov(char cuadricula[][COLUMNAS], int posicion[][3], int total)
{
    int counter=0;
    int maxcounter=0;
    int i,j,k;
    
    for(i=RAYAS-1;i<FILAS;i++)//Comienza en la fila RAYAS-1, pues en las anteriores no puede empezar una raya.
    {
        for(j=0;j<COLUMNAS;j++)//No hay limitación, pues una raya vertical puede empezar en cualquier columna.
        {
            if(cuadricula[i][j]=='O')
            {
                if(i==FILAS-1)//En la última fila no hay que verificar que el elemneto anterior sea distinto, pues en tería no hay.
                {
                    //El elemento que está arriba de la "O" detectada es el cuadricula[i-k-1][j].
                    for(k=0;k<RAYAS-1 && cuadricula[i][j]==cuadricula[i-k-1][j] && maxcounter+total<MAXIMO;k++)
                    {
                        counter++;
                    }
                    if(counter>=RAYAS-1)
                    {
                        //Como las posiciones que van desde 0 hasta total-1 ya están ocupadas, empezará a almacenar a partir de la fila "total".
                        posicion[maxcounter+total][0]=i+1;
                        posicion[maxcounter+total][1]=j+1;
                        posicion[maxcounter+total][2]=2;//Lo mismo de antes, pero esta vez se pone un 2 en la última columna, para identificarla como una raya vertical.
                        maxcounter++;
                    }
                }
                else
                {
                    for(k=0;k<RAYAS-1 && cuadricula[i][j]==cuadricula[i-k-1][j] && cuadricula[i][j]!=cuadricula[i+1][j] && maxcounter+total<MAXIMO;k++)
                    {
                        counter++;
                    }
                    if(counter>=RAYAS-1)
                    {
                        posicion[maxcounter+total][0]=i+1;
                        posicion[maxcounter+total][1]=j+1;
                        posicion[maxcounter+total][2]=2;
                        maxcounter++;
                    }
                }
                counter=0;
            }
        }
    }
    return maxcounter;
}

//Detectar y contar horizontales
int numeroh(char cuadricula[][COLUMNAS], int posicion[][3], int total)
{
    int counter=0;
    int maxcounter=0;
    int i,j,k;
    
    for(i=0;i<FILAS;i++)//No hay limitación, pues una raya horizontal puede empezar en cualquier fila.
    {
        for(j=0;j<COLUMNAS-RAYAS+1;j++)//No toma en cuenta a partir de la columna COLUMNAS-RAYAS+1, pues es imposible que haya una raya horizontal
        {
            if(cuadricula[i][j]=='O')
            {
                if(j==0)//En la primera columna no hay que verificar que el elemneto anterior sea distinto, pues en tería no hay.
                {
                    //El elemento que está a la derecha de la "O" detectada es el cuadricula[i][j+k+1].
                    for(k=0;k<RAYAS && cuadricula[i][j]==cuadricula[i][j+k+1] && maxcounter+total<MAXIMO;k++)
                    {
                        counter++;
                    }
                    if(counter>=RAYAS-1)
                    {
                        //Como las posiciones que van desde 0 hasta total-1 ya están ocupadas, empezará a almacenar a partir de la fila "total".
                        posicion[maxcounter+total][0]=i+1;
                        posicion[maxcounter+total][1]=j+1;
                        posicion[maxcounter+total][2]=3;//Lo mismo de antes, pero esta vez se pone un 3 en la última columna, para identificarla como una raya horizontal.
                        maxcounter++;
                    }
                }
                else
                {
                    for(k=0;k<RAYAS && cuadricula[i][j]==cuadricula[i][j+k+1] && cuadricula[i][j]!=cuadricula[i][j-1] && maxcounter+total<MAXIMO;k++)
                    {
                        counter++;
                    }
                    if(counter>=RAYAS-1)
                    {
                        posicion[maxcounter+total][0]=i+1;
                        posicion[maxcounter+total][1]=j+1;
                        posicion[maxcounter+total][2]=3;
                        maxcounter++;
                    }
                }
                counter=0;
            }
        }
    }
    return maxcounter;
}

void juego(char tablilla[][COLUMNAS], struct partida q[], int numerop)
{
    int a,k;
    printf("Jugador 1 elige una columna del 1 al %d",COLUMNAS);
    scanf("%d",&a);
    while(a>COLUMNAS || a<1)
    {
        printf("Esa columna no existe wey, deja de trolliarme jaja salu3");
        scanf("%d",&a);
    }
    for(k=0;k<FILAS && tablilla[k][a]==' ';k++)
    {
        if(k%2==0)
        {
            tablilla[k][a]=q[numerop].ficha_comienzo;
        }
        else
        {
            if(q[numerop].ficha_comienzo=='x')
            {
                tablilla[k][a]='o';
            }
            else
            {
                tablilla[k][a]='x';
            }
        }
    }
    creartablero(tablilla);
}

Accepted Reply

Replies

I would first try to do a Clean Build folder (XCode > Product menu)

I´ve just done the clean build folder and it doesn't work as before. What should i do? do you have any other idea? thanks a lot.

You are using a 32 bits library instead of 64 bits.


May have a look here for further investigation.

w ww.cplusplus.com/forum/beginner/140778/


Wish you good luck.

And do you know how can i chenge the librarys. Thank you for everything you did 🙂