Définition de plusieurs de d'abord défini ici gcc
J'ai ces fichiers
consumer.cpp
consumer.hpp
defines.hpp
main.cpp
makefile
producer.cpp
producer.hpp
voici le fichier définit.php
#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
Ceci définit.php fichier est inclus dans le producteur.php et le consommateur.hpp. le producteur.php et le consommateur.php les fichiers, respectivement inclus à producer.cpp et consumer.cpp et encore main.cpp.
Lors de la compilation j'obtiens une erreur.
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
Voici mon 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
Comment résoudre ce problème ?
Vous devez vous connecter pour publier un commentaire.
En C++ (comme en C) il y a une différence entre déclarant et définition des choses comme des variables. Ce que vous faites dans le fichier d'en-tête est définition les variables, ce qui signifie que chaque fichier source qui inclut le fichier d'en-tête auront les définitions.
Dans le fichier d'en-tête, vous ne devez déclarer les variables, puis dans un seul fichier source les définir.
Donc dans le fichier d'en-tête n'par exemple
Puis dans un seul fichier source placer les définitions (ce que vous avez maintenant).
extern
qui a été le mot-clé qui a fait la différence.