Multiple definition of first defined here gcc

49,157

In C++ (as well as in C) there is a difference between declaring and defining things like variables. What you are doing in the header file is defining the variables, which means that every source file that includes the header file will have the definitions.

In the header file you should only declare the variables, and then in a single source file define them.

So in the header file do e.g.

extern pthread_mutex_t set_queue_mutex;
extern pthread_cond_t  condition_var;

extern std::queue<int> q;

And then in a single source file put the definitions (what you have now).

Share:
49,157
Admin
Author by

Admin

Updated on July 09, 2022

Comments

  • Admin
    Admin almost 2 years

    I have these files

    consumer.cpp
    consumer.hpp
    defines.hpp
    main.cpp
    makefile
    producer.cpp
    producer.hpp
    

    here's the file defines.hpp

    #ifndef DEFINES_HPP
    #define DEFINES_HPP
    
    #include <cassert>
    #include <pthread.h> 
    #include <queue>
    #include <stdlib.h>
    #include <string>
    #include <unistd.h>
    
    pthread_mutex_t set_queue_mutex = PTHREAD_MUTEX_INITIALIZER;
    pthread_cond_t  condition_var = PTHREAD_COND_INITIALIZER;
    
    std::queue<int> q;
    
    #endif // DEFINES_HPP
    

    This defines.hpp file is included in the producer.hpp and consumer.hpp. producer.hpp and consumer.hpp files respectively included to producer.cpp and consumer.cpp and yet to main.cpp. When compiling I get an error.

    g++ -o main producer.cpp consumer.cpp main.cpp producer.hpp consumer.hpp defines.hpp -lpthread -ggdb
    /tmp/ccctuRp7.o: In function `__gnu_cxx::new_allocator<int>::destroy(int*)':
    /home/vardan/test/consumer.cpp:8: multiple definition of `set_queue_mutex'
    /tmp/cciGccft.o:/home/vardan/test/producer.cpp:8: first defined here
    /tmp/ccctuRp7.o: In function `std::deque<int, std::allocator<int> >::front()':
    /home/vardan/test/consumer.cpp:12: multiple definition of `condition_var'
    /tmp/cciGccft.o:/home/vardan/test/producer.cpp:11: first defined here
    /tmp/ccctuRp7.o: In function `global::consumer::entry_point(void*)':
    /home/vardan/test/consumer.cpp:17: multiple definition of `q'
    /tmp/cciGccft.o:/home/vardan/test/producer.cpp:17: first defined here
    /tmp/ccKCxptM.o: In function `main':
    /home/vardan/test/main.cpp:8: multiple definition of `set_queue_mutex'
    /tmp/cciGccft.o:/home/vardan/test/producer.cpp:8: first defined here
    /tmp/ccKCxptM.o: In function `main':
    /home/vardan/test/main.cpp:13: multiple definition of `condition_var'
    /tmp/cciGccft.o:/home/vardan/test/producer.cpp:11: first defined here
    /tmp/ccKCxptM.o: In function `main':
    /home/vardan/test/main.cpp:25: multiple definition of `q'
    /tmp/cciGccft.o:/home/vardan/test/producer.cpp:17: first defined here
    collect2: error: ld returned 1 exit status
    make: *** [main] Error 1
    

    Here is my makefile

    main : producer.cpp consumer.cpp main.cpp producer.hpp consumer.hpp defines.hpp
        g++ -o $@ $^ -lpthread -ggdb
    .PHONY : clean
    clean:
        rm -rf main *.swf *.o
    

    How to solve this problem ?