此处首先定义的多重定义 gcc

我有这些文件

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

这是文件defines.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

这个defines.hpp 文件包含在producer.hpp 和consumer.hpp 中.producer.hpp 和consumer.hpp 文件分别包含在producer.cpp 和consumer.cpp 和main.cpp 中.编译时出现错误.

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

这是我的生成文件

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++(以及 C)中,声明和定义是有区别的,比如变量.您在头文件中所做的是定义变量,这意味着包含头文件的每个源文件都将具有定义.

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.

所以在头文件中做例如

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).

相关文章