此处首先定义的多重定义 gcc
Posted
技术标签:
【中文标题】此处首先定义的多重定义 gcc【英文标题】:Multiple definition of first defined here gcc 【发布时间】:2013-11-09 15:20:01 【问题描述】:我有这些文件
consumer.cpp
consumer.hpp
defines.hpp
main.cpp
makefile
producer.cpp
producer.hpp
这是文件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 中。 编译时出现错误。
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
如何解决这个问题?
【问题讨论】:
【参考方案1】:在 C++(以及 C)中,声明和定义变量之类的东西是有区别的。您在头文件中所做的是定义变量,这意味着包含头文件的每个源文件都将具有定义。
在头文件中你应该只声明变量,然后在单个源文件中定义它们。
所以在头文件中做例如
extern pthread_mutex_t set_queue_mutex;
extern pthread_cond_t condition_var;
extern std::queue<int> q;
然后在单个源文件中放入定义(您现在拥有的)。
【讨论】:
extern
那是造成差异的关键字。以上是关于此处首先定义的多重定义 gcc的主要内容,如果未能解决你的问题,请参考以下文章