c++ gcc linker include multiple-definition-error

c++ - Definición múltiple de la primera definida aquí gcc



linker include (1)

En C ++ (así como en C) hay una diferencia entre declarar y definir cosas como variables. Lo que está haciendo en el archivo de encabezado es definir las variables, lo que significa que cada archivo fuente que incluya el archivo de encabezado tendrá las definiciones.

En el archivo de encabezado, solo debe declarar las variables y, a continuación, definirlas en un solo archivo fuente.

Así en el archivo de cabecera, por ejemplo,

extern pthread_mutex_t set_queue_mutex; extern pthread_cond_t condition_var; extern std::queue<int> q;

Y luego, en un solo archivo fuente, coloque las definiciones (lo que tiene ahora).

Tengo estos archivos

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

Aquí está el archivo define.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

Este archivo define.hpp se incluye en producer.hpp y consumer.hpp. Los archivos producer.hpp y consumer.hpp se incluyen respectivamente en producer.cpp y consumer.cpp y, sin embargo, en main.cpp. Al compilar me sale un 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

Aquí está mi 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

Cómo resolver este problema ?