Quantcast
Channel: Active questions tagged gcc - Stack Overflow
Viewing all articles
Browse latest Browse all 21994

error in compiling: undefined reference to 'nameOfFunction'

$
0
0

I have a project in c and I cannot compile it because of errors. I use CLion editor and compile it there(using the play button). I get the following error:

CMakeFiles/GameServer.dir/game.c.o: In function `hra':
/home/irina/CLionProjects/GameServer/game.c:59: undefined reference to `broadcast'
/home/irina/CLionProjects/GameServer/game.c:86: undefined reference to `broadcast'
/home/irina/CLionProjects/GameServer/game.c:92: undefined reference to `receive'
/home/irina/CLionProjects/GameServer/game.c:95: undefined reference to `receive'
...
/home/irina/CLionProjects/GameServer/game.c:234: undefined reference to `broadcast'
/home/irina/CLionProjects/GameServer/game.c:249: undefined reference to `broadcast'
/home/irina/CLionProjects/GameServer/game.c:261: undefined reference to `broadcast'
CMakeFiles/GameServer.dir/game.c.o:/home/irina/CLionProjects/GameServer/game.c:275: more undefined references to `broadcast' follow

I don't understand why, I have the functions defined in another file. Here is how my files look:

main.h:


#ifndef SERVER_MAIN_H
#define SERVER_MAIN_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <time.h>
#include "structures.h"
#define PORT 10211
#define LOBBYSIZE 3

place lobby[LOBBYSIZE];


void broadcast(int socket, int socket1, char *sbuff);
void receive(int socket, char *buff);
void initializeLobby();
void sendMess(int newSocket, char *sbuff, int lenBuff);
typedef char *str[3];

char parseRecvMess(char *buff);

void addToLobby(player *hrac);
int main();

#endif //SERVER_MAIN_H

and main.c :


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <time.h>
#include <sys/queue.h>
//#include "player.h"
#include "game.h"
#include "main.h"
#include "structures.h"

//#define PORT 10126
//#define LOBBYSIZE 3

//TODO

//send a message to all players
void broadcast(int socket, int socket1, char *sbuff) {
    //printf("Broadcast function called\n");
    send(socket, sbuff, 256, 0);
    send(socket1, sbuff, 256, 0);
}

//recieve message from clients
void receive(int socket, char *buff){
    int size = 256;
    char *user;
    char *command;
    int reader = recv(socket, buff, size * sizeof(char), 0);
    if (reader == -1) {
        printf("BREAK reader == -1\n");
        perror("recv()");
        exit(0);
    } else if (reader == 0) {
        printf("BREAK reader == 0\n");
        exit(0);
    }
//    else {
//        command = strtok(buff, ":"); //split received message in name and command
//        user = command;
//        command = strtok(NULL, ":");
//        printf("\n%s sent: %s\n", user, command);
//     }
}

place lobby[LOBBYSIZE]; //declare lobby

void initializeLobby(){
    lobby[0].name = "Mistnost 1";
    lobby[0].id = 0;
    lobby[0].max_pocet_hracu = 2;
    lobby[0].pocet_hracu = 0;
    lobby[1].name = "Mistnost 2";
    lobby[1].id = 1;
    lobby[1].max_pocet_hracu = 2;
    lobby[1].pocet_hracu = 0;
    lobby[2].name = "Mistnost 3";
    lobby[2].id = 2;
    lobby[2].max_pocet_hracu = 2;
    lobby[2].pocet_hracu = 0;
//
}

void sendMess(int newSocket, char *sbuff, int lenBuff) {
    printf("Ve funkci sendMess1\n");
    write(newSocket, sbuff, lenBuff);
    printf("Ve funkci sendMess2\n");
    //bzero(*sbuff,lenBuff);
    //sbuff = "";
    printf("Ve funkci sendMess3\n");
}

typedef char *str[3]; // char used in addToLobby for converting int -> string

//void clearMistnost(place *m){
//    m->pocet_hracu = 0;
//    m->player1.gameScore = 0;
//    m->player2.gameScore = 0;
//}



char parseRecvMess(char *buff){
    char a[2];
    char *user;
    char *command;
    command = strtok(buff, ":"); //split received message in name and command
    user = command;
    command = strtok(NULL, ":");
    a[0] = (char) user;
    a[1] = (char) command;
    return (char) a;
}




//Add player to lobby
void addToLobby(player *hrac){
    int size = 256;
    char sbuff[size];
    char buff[size];
    memset(sbuff, '\0', size);
    strcpy(sbuff, "Ahoj " );
    strcat(sbuff, hrac->name);
    strcat(sbuff, " vitej ve hre. Vyber si mistnost:+");
    for( int i = 0; i< LOBBYSIZE; i++) {
        strcat(sbuff, lobby[i].name);
        strcat(sbuff, ": pocet hracu = ");
        str str;// TODO
        //itoa(lobby[i].pocet_hracu, str, 10);
        sprintf(str, "%d", lobby[i].pocet_hracu);
        strcat(sbuff, str);
        strcat(sbuff, "+");
    }
    strcat(sbuff, ":\n");
    send(hrac->socket, sbuff, sizeof(sbuff), 0);
    bzero(sbuff, size);
    int volba = 1000;

    while ((volba < 1) || (volba > LOBBYSIZE)) {
        receive(hrac->socket, buff);// read the message from client and copy it in buffer
        char *command; // sent command
        char *user; //user name
        command = strtok(buff, ":"); //split received message in name and command
        user = command;
        command = strtok(NULL, ":");
        printf("\n%s sent: %s", user, command);
        // volba mistnosti
        volba = atoi(command);
        if (lobby[volba - 1].pocet_hracu < lobby[volba - 1].max_pocet_hracu) { // hrac se do mistnosti vejde
            hrac->mist = &lobby[volba - 1];
            if (lobby[volba - 1].pocet_hracu == 0) {
                lobby[volba - 1].player1 = *hrac;
            } else {
                lobby[volba - 1].player2 = *hrac;
            }
            lobby[volba - 1].pocet_hracu++;
            memset(sbuff, '\0', size);
            strcpy(sbuff, "Jsi v mistnosti: "); // TODO strncpy
            //strncpy()
            strcat(sbuff, hrac->mist->name);
            strcat(sbuff, "\n");
            send(hrac->socket, sbuff, sizeof(sbuff), 0); // TODO kontrolu v metode
            //printf("%s si vybral %s\n", hrac->name, hrac->mist->name);
            //bzero(sbuff, size);
            //printf("Pokus2.");
        }
        if(hrac->mist->pocet_hracu != 2){
            //printf("Cekame na druheho hrace...");
            strcpy(sbuff, "Cekame na druheho hrace...\n");
            send(hrac->socket, sbuff, sizeof(sbuff), 0);
        }
        //hra(hrac->mist);
    }

}


int main(){
//    struct mistnost lobby[3];

    initializeLobby();

    srand(time(NULL));
    //memset(&lobby, '\0', sizeof(lobby));

    //fork();
    int socketfd, ret;
    struct sockaddr_in serverAddr;

    int newSocket;
    struct sockaddr_in newAddr;

    socklen_t addr_size;

    //char buffer[1024];
    pid_t childpid;

    socketfd = socket(AF_INET,SOCK_STREAM,0);

    if(socketfd < 0){
        printf("\n error in socket creation");
        return -1;
    }
    printf("\n Server socket is created\n");

    memset(&serverAddr, '\0', sizeof(serverAddr));
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = htons(PORT);
    serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");

    ret = bind(socketfd, (struct sockaddr*)&serverAddr, sizeof(serverAddr));

    if(ret < 0){
        printf("Error in binding\n");
        return -1;
    }
    printf("[*]Bind to port %d\n", PORT);

    if(listen(socketfd, 10) == 0){
        printf("Listening...\n");
    }else{
        printf("Error in binding\n");
    }

    int size = 256;
    char buff[size];
    char sbuff[size];
    int n;
    int reader;
    memset(buff, 0, size);
    memset(sbuff, 0, size);

    // infinite loop for receiving and sending
    for (;;) {
        newSocket = accept(socketfd, (struct sockaddr*)&newAddr, &addr_size);
        if( newSocket < 0){
            printf("No socket\n");
            exit(1);
        }
        // read the message from client and copy it in buffer
        reader = recv(newSocket, buff, size * sizeof(char), 0);
        if (reader == -1) {
            perror("recv()");
            break;
        } else if (reader == 0) {
            break;
        } else {
            char *command; // sent command
            char *user; //user name
            command = strtok(buff, ":"); //split received message in name and command
            user = command;
            command = strtok(NULL, ":" );
            printf("\n%s sent: %s", user, command);

            if (strncmp(" new", command, 4) == 0) {
                player newPlayer;
                newPlayer.name = (char *)malloc(sizeof(char)*10); // *login must contain up to 10 characters
                strcpy(newPlayer.name, user);
                //newPlayer.name = user;
                newPlayer.gameScore = 0;
                newPlayer.roundScore = 0;
                newPlayer.socket = newSocket;
                //newPlayer.ans = "";
                //newPlayer.mist = null;

                //addPlayerToList(&newPlayer); // pridame hrace do seznamu
                addToLobby(&newPlayer); // pridame hrace do lobby

                printf("Server : %s uspesne prihlasen.\n", newPlayer.name);
                //while(1) { \\ TODO
                    if (newPlayer.mist->pocet_hracu == 2){

                        printMistnost(newPlayer.mist);
                        hra(newPlayer.mist);
                        printf("Konec hry\n");
                        clearMistnost(newPlayer.mist); // mist.pocet_hracu = 0
                        addToLobby(&newPlayer.mist->player1);
                        addToLobby(&newPlayer.mist->player2);
                    }
                //}
            }

            //TODO playing multiple games in different lobby rooms at te same time

            if (strncmp("exit", command, 4) == 0) {
                printf("Server Exit...\n");
                break;
            }
            bzero(buff, size);

            //n = 0;
            printf("To client : OK\n");
            strcpy(sbuff, "OK\n" );

            // copy server message in the buffer
            //while (((sbuff[n++] = getchar()) != '\n'));

            // and send that buffer to client
            write(newSocket, sbuff, sizeof(sbuff));
            //bzero(sbuff, size);
            // }
        }

        if((childpid = fork()) == 0){
            close(socketfd);

//            while(1){
//                printf("MAIN->while(1)\n");
//                read(newSocket, buff, size);
//                printf("MAIN->while(2)\n");
//
//                if(strcmp(buff,":exist") == 0){
//                    printf("Disconnected from %s:%d\n", inet_ntoa(newAddr.sin_addr), ntohs(newAddr.sin_port));
//                    break;
//                } else{
//                    char *command; // sent command
//                    char *user; //user name
//
//                    command = strtok(buff, ":"); //split received message in name and command
//                    user = command;
//                    command = strtok(NULL, ":" );
//                    lobby->player1.ans = command;
//                    printf("Client: %s\n", buff);
//                    //scanf("%s", &sbuff[0]);
//                    //sendMess(newSocket, sbuff, strlen(sbuff));
//                    strcpy(sbuff, "OK\n" );
//                    write(newSocket, sbuff, strlen(sbuff));
//                    bzero(buff, sizeof(buff));
//                    bzero(sbuff, sizeof(sbuff));
//                }
//            }
        }

    }
    close(newSocket);

    return 0;
}

and the file game.c where I use the function 'broadcast' and 'receive':


//#include <stdio.h>
#include <stdlib.h>
#include "main.h"
#include "game.h"
#include <stdio.h>

void printMistnost(place *m){
    printf("Name = %s\n", m->name);
    printf("pocet hracu = %d\n", m->pocet_hracu);
    printf("Player1: \n");
    printf("\tName = %s\n", m->player1.name);
    printf("\troundScore = %d\n", m->player1.roundScore);
    printf("\tgameScore = %d\n", m->player1.gameScore);
    printf("\tsocket = %d\n", m->player1.socket);
    printf("Player2: \n");
    printf("\tName = %s\n", m->player2.name);
    printf("\troundScore = %d\n", m->player2.roundScore);
    printf("\tgameScore = %d\n", m->player2.gameScore);
    printf("\tsocket = %d\n", m->player2.socket);
}

void clearMistnost(place *m){
    m->pocet_hracu = 0;
    m->player1.gameScore = 0;
    m->player2.gameScore = 0;
}


int hod(){//int *cisla[6]){
    printf("Hazim kostkou\n");
    int score = 0;
    int cislo;
    //int cisla[6];
    for (int i = 0; i < 6; i++){
        cislo = (rand() % 6) + 1;
        printf("%d: %d\n",i+1, cislo);
        cisla[i] = cislo;
    }
    printf("\n");
    for( int i = 0; i < 3; i++){
        if(cisla[i] == 1 ){
            return score = 0;
        }
        score += cisla[i];
    }
    return score;
}

void hra(place *m){ // pointer
    int size = 256;
    char sbuff[size];
    char buff[size];
    int reader;
    memset(sbuff, '\0', size);
    strcpy(sbuff, "Hra zacina.\t\n");
    broadcast(m->player1.socket, m->player2.socket, sbuff);
    //printf("Hra zacina...\n");
    int vyhra = 20;
    //int cisla[6];
    int vysledekHodu;
    int maxBodu = 0;
    int hraje = 1;
    char pokracovat;
    struct hrac vyherce;
    char *command; // sent command
    char *user; //user name
    str str;
    //int player = 1;
    while(1) {
        vysledekHodu = 0;
        for (int i = 0; i < m->pocet_hracu; i++) {
            hraje = 1;
            printf("Hraje hrac %d\n", i+1);
            memset(sbuff, '\0', size);
            strcpy(sbuff, "player ");
            if( i == 0){
                sprintf(str, "%s", m->player1.name);
            } else {
                sprintf(str, "%s", m->player2.name);
            }
            strcat(sbuff, str);
            strcat(sbuff, "\n");
            broadcast(m->player1.socket, m->player2.socket, sbuff);
            int pokracuje = 0;
            while(hraje) {
                //printf("Pred hodem kostgcc main.c game.c player.ckou.\n");
                if (pokracuje == 0){
                    if( i == 0) {
                        receive(m->player1.socket, buff);

                    } else {
                        receive(m->player2.socket, buff);
                    }
                    command = strtok(buff, ":"); //split received message in name and command
                    user = command;
                    command = strtok(NULL, ":");
                    printf("\n%s sent: %s\n", user, command);
                }
                //if (pokracuje){
                    vysledekHodu = hod();//(int **) &cisla);
                //}

                sleep(1);
                //broadcast results to both players
                for(int j =0; j<3; j++) {
                    memset(sbuff, '\0', size);
                    strcat(sbuff, "dice ");
                    sprintf(str, "%d", j+1);
                    strcat(sbuff, str);
                    strcat(sbuff, "");
                    sprintf(str, "%d", cisla[j]);
                    strcat(sbuff, str);
                    strcat(sbuff, "\n");
                    broadcast(m->player1.socket, m->player2.socket, sbuff);
                    sleep(1);
                }

                printf("Vysledek hodu = %d\n", vysledekHodu);
                //printf("Pred send \n");
                memset(sbuff, '\0', size);
                strcpy(sbuff, "Vysledek hodu =  ");
                sprintf(str, "%d", vysledekHodu);
                strcat(sbuff, str);
                strcat(sbuff, "\n");
                broadcast(m->player1.socket, m->player2.socket, sbuff);


                if (vysledekHodu > 0) {
                    if (i == 0) { // hraje prvni hrac
                        m->player1.roundScore += vysledekHodu;
                        printf("Hraje hrac: %s\n", m->player1.name);
                        strcpy(sbuff, "pokracovat dalsim hodem? A-ano , N-ne :\n");
                        send(m->player1.socket, sbuff, sizeof(sbuff), 0);
                        //printf("Po send 1. hracu\n");
                    } else { // hraje druhy hrac
                        m->player2.roundScore += vysledekHodu;
                        printf("Hraje hrac: %s\n", m->player2.name);
                        strcpy(sbuff, "pokracovat dalsim hodem? A-ano, N-ne :\n");
                        send(m->player2.socket, sbuff, sizeof(sbuff), 0);
                        //printf("Po send 2. hracu \n");
                    }
                    memset(sbuff, '\0', size);
                    strcpy(sbuff, "roundScore ");
                    sprintf(str, "%d", i+1);
                    strcat(sbuff, str);
                    strcat(sbuff, "");
                    if ( i == 0) {
                        sprintf(str, "%d", m->player1.roundScore);
                        strcat(sbuff, str);
                        strcat(sbuff, "\n");
                    } else {
                        sprintf(str, "%d", m->player2.roundScore);
                        strcat(sbuff, str);
                        strcat(sbuff, "\n");
                    }
                    broadcast(m->player1.socket, m->player2.socket, sbuff);
                    memset(sbuff, '\0', size);

                    printf("Pokracovat dalsim hodem? \n");
                    memset(buff, '\0', size);
                    //Receive message
                    if (i == 0) { //pokud hraje 1. hrac
                        //printf("CONTROL RCV 1.hrac\n");
                        receive(m->player1.socket, buff);
                        command = strtok(buff, ":"); //split received message in name and command
                        user = command;
                        command = strtok(NULL, ":");
                        printf("\n%s sent: %s\n", user, command);
                        if (strncmp(" A", command, 2) == 0){
                            memset(sbuff, '\0', size);
                            strcpy(sbuff, "Protihrac pokracuje...\n");
                            send(m->player2.socket, sbuff, sizeof(sbuff), 0);
                            pokracuje = 1;
                        }
                        //m->player1.ans = command;
                        //printf("player1 ans = '%s'\n", m->player1.ans);
                    }else { //pokud hraje 2. hrac
                        //printf("CONTROL RCV 2.hrac\n");
                        receive(m->player2.socket, buff);
                        //printf("2CONTROL RCV 2. hrac \n");
                        command = strtok(buff, ":"); //split received message in name and command
                        user = command;
                        command = strtok(NULL, ":");
                        printf("\n%s sent: %s\n", user, command);
                        if (strncmp(" A", command, 2) == 0){
                            memset(sbuff, '\0', size);
                            strcpy(sbuff, "Protihrac pokracuje...\n");
                            send(m->player1.socket, sbuff, sizeof(sbuff), 0);
                        }
                    }

                    //Kontrola odpovedi na otazku jestli chce pokracovat
                    printf("Pred controlou rcv + %s\n", command);
                    if (strncmp(" A", command, 2) == 0) {
                        hraje = 1;
                    } else { // hrac konci svoje kolo
                        hraje = 0;
                        if (i == 0) { // hraje prvni hrac
                            m->player1.gameScore += m->player1.roundScore;
                            m->player1.roundScore = 0;
                            memset(sbuff, '\0', size);
                            strcpy(sbuff, "gameScore1 ");
                            sprintf(str, "%d", m->player1.gameScore);
                            strcat(sbuff, str);
                            broadcast(m->player1.socket, m->player2.socket, sbuff);
                            memset(sbuff, '\0', size);
                        } else { // hraje druhy hrac
                            m->player2.gameScore += m->player2.roundScore;
                            m->player2.roundScore = 0;
                            memset(sbuff, '\0', size);
                            strcpy(sbuff, "gameScore2 ");
                            sprintf(str, "%d", m->player2.gameScore);
                            strcat(sbuff, str);
                            broadcast(m->player1.socket, m->player2.socket, sbuff);
                            memset(sbuff, '\0', size);
                        }
                    }
                } else {
                    hraje = 0;
                }
            }
            memset(sbuff, '\0', size);
            strcpy(sbuff, "Celkovy pocet hodu hrace 1 =  ");
            sprintf(str, "%d", m->player1.gameScore);
            strcat(sbuff, str);
            strcat(sbuff, "\n");
            strcat(sbuff, "Celkovy pocet hodu hrace 2 =  ");
            sprintf(str, "%d", m->player2.gameScore);
            strcat(sbuff, str);
            strcat(sbuff, "\n");
            broadcast(m->player1.socket, m->player2.socket, sbuff);
            //send(m->player1.socket, sbuff, sizeof(sbuff), 0);
            //send(m->player2.socket, sbuff, sizeof(sbuff), 0);
            memset(sbuff, '\0', size);
        }
        printf("control if smbd won--------------------------------------------------------------\n");
        if ((m->player1.gameScore >= vyhra) || (m->player2.gameScore >= vyhra)) { // nektery hrac jiz vyhral // TODO!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            printf("!!!!!!!!!!!!!!!!!smbd won!!!!!!!!!!!!!!!!!!!\n");
            if (m->player1.gameScore == m->player2.gameScore) { // remiza
                printf("Remiza: pocet bodu = %d", m->player1.gameScore);
                memset(sbuff, '\0', size);
                strcpy(sbuff, "Vysledek hry: Remiza. Pocet bodu=  ");
                sprintf(str, "%d", m->player1.gameScore);
                strcat(sbuff, str);
                strcat(sbuff, "\n");
                broadcast(m->player1.socket, m->player2.socket, sbuff);
                //send(m->player1.socket, sbuff, sizeof(sbuff), 0);
                //send(m->player2.socket, sbuff, sizeof(sbuff), 0);
            } else if (m->player1.gameScore > m->player2.gameScore) { // vyhral prvni hrac
                printf("Vyhral hrac %s a ma %d bodu.", m->player1.name, m->player1.gameScore);
                memset(sbuff, '\0', size);
                strcpy(sbuff, "Vyhral hrac ");
                strcat(sbuff, m->player1.name );
                strcat(sbuff, ". Pocet bodu: " );
                sprintf(str, "%d", m->player1.gameScore);
                strcat(sbuff, str);
                strcat(sbuff, "\n");
                broadcast(m->player1.socket, m->player2.socket, sbuff);
                //send(m->player1.socket, sbuff, sizeof(sbuff), 0);
                //send(m->player2.socket, sbuff, sizeof(sbuff), 0);
            } else { // vyhral druhy hrac
                printf("Vyhral hrac %s a ma %d bodu.", m->player2.name, m->player2.gameScore);
                memset(sbuff, '\0', size);
                strcpy(sbuff, "Vyhral hrac ");
                strcat(sbuff, m->player2.name );
                strcat(sbuff, ". Pocet bodu: " );
                sprintf(str, "%d", m->player2.gameScore);
                strcat(sbuff, str);
                strcat(sbuff, "\n");
                //send(m->player1.socket, sbuff, sizeof(sbuff), 0);
                //send(m->player2.socket, sbuff, sizeof(sbuff), 0);
                broadcast(m->player1.socket, m->player2.socket, sbuff);
            }
            return;
        }
    }
    exit(0);
}

Viewing all articles
Browse latest Browse all 21994

Trending Articles