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 ?