Ошибка множественного определения C ++ при компиляции в G ++ - PullRequest
0 голосов
/ 02 мая 2018

Я сталкиваюсь с некоторыми проблемами при компиляции и не знаю почему. Я получаю ошибку множественного определения для нескольких вещей, однако, насколько мне известно, я определяю их только один раз. Я не понимаю, почему это происходит, и где эти определения происходят, и почему это не работает. Я не очень знаком с C ++, поэтому я не уверен, что делаю здесь неправильно, и был бы признателен за помощь.

сделать

/usr/bin/g++ -c -o object/author.o src/author.cpp -g -I./include
/usr/bin/g++ -o ---- object/connection_manager.o object/author.o.   object/control_header_lib.o object/network_util.o object/main.o     object/control_handler.o -g -I./include 
object/main.o:(.bss+0x4): multiple definition of `control_socket'
object/connection_manager.o:(.bss+0x104): first defined here
object/main.o: In function `main':
/home/Documents/---/src/main.cpp:9: multiple definition of `router_socket'
object/connection_manager.o:/home/Documents/---/src.   /connection_manager.cpp:35: first defined here
object/main.o: In function `main':
/home/Documents/---/src/main.cpp:9: multiple definition of `data_socket'
object/connection_manager.o:/home/Documents/---/src. /connection_manager.cpp:35: first defined here
object/control_handler.o:(.bss+0x0): multiple definition of  `CONTROL_PORT'
object/main.o:/home/Documents/---/src/main.cpp:9: first defined here
object/connection_manager.o: In function `main_loop()':
/home/Documents/---/src/connection_manager.cpp:33: undefined reference to `new_control_conn(int)'
/home/Documents/---/src/connection_manager.cpp:54: undefined reference to `isControl(int)'
/home/Documents/---/src/connection_manager.cpp:56: undefined reference  to `control_recv_hook(int)'
collect2: error: ld returned 1 exit status
Makefile:19: recipe for target '----' failed
make: *** [----] Error 1

main.cpp

#include "../include/global.h"
#include "../include/connection_manager.h"

using namespace std;
int sockfd;

int main(int argc, char **argv)
{
    if(argc != 2){
        ERROR("Incorrect number of args...\n");
    }
    printf("control port: %d\n", atoi(argv[1]));
    sscanf(argv[1], "%" SCNu16, &CONTROL_PORT);
    init();
    return 0;
}

global.h

#ifndef GLOBAL_H_
#define GLOBAL_H_

#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>

#define ERROR(err_msg) {perror(err_msg); exit(EXIT_FAILURE);}
#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)])) 



#endif

connection_manager.cpp

#include <sys/select.h>
#include "../include/connection_manager.h"
#include "../include/global.h"
#include "../include/control_handler.h"

int control_socket, router_socket, data_socket;

void init()
{
    control_socket = create_control_sock();
}

connection_manager.h

#ifndef CONNECTION_MANAGER_H_
#define CONNECTION_MANAGER_H_

void init();

#endif

control_handler.cpp

#include <sys/socket.h>
#include <netinet/in.h>
#include <strings.h>
#include <sys/queue.h>
#include <unistd.h>
#include <string.h>
#include <list>

#include "../include/global.h"
#include "../include/network_util.h"
#include "../include/control_header_lib.h"
#include "../include/author.h"

#ifndef PACKET_USING_STRUCT
    #define CNTRL_CONTROL_CODE_OFFSET 0x04
    #define CNTRL_PAYLOAD_LEN_OFFSET 0x06
#endif

struct ControlConn  // linked list for active control connections
{
    int sockfd;
    // ..
}*connection, *conn_temp;

std::list<ControlConn> control_conn_list;

int create_control_sock()
{
    int sock;
    struct sockaddr_in control_addr;
    socklen_t addrlen = sizeof(control_addr);

    sock = socket(AF_INET, SOCK_STREAM, 0);

    if (sock < 0){
        ERROR("Failed to create socket...\n");
    }

    bzero(&control_addr, addrlen);
    control_addr.sin_family = AF_INET;
    control_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    control_addr.sin_port = htons(CONTROL_PORT);

    if (bind(sock, (struct sockaddr *)&control_addr, addrlen) < 0){
        ERROR("Bind failed...");
    }

    if (listen(sock, 5) < 0){
        ERROR("Listen failed...");
    }

    return sock;
}

control_handler.h

#ifndef CONTROL_HANDLER_H_
#define CONTROL_HANDLER_H_

int create_control_sock();
int new_control_conn(int sock_index);
bool isControl(int sock_index);
bool control_recv_hook(int sock_index);

#endif

1 Ответ

0 голосов
/ 02 мая 2018

В заголовочном файле нужно просто объявить переменную:

extern uint16_t CONTROL_PORT;

Тогда в соответствующем файле cpp (global.cpp) вы должны определить его:

uint16_t CONTROL_PORT;
...