我的pthread_mutex_t有问题。当我尝试创建静态字段pthread_mutex_t时,然后在静态函数中初始化它,最后在一些类方法中使用它我得到很多错误,如:
main.o: In function `LogWriter::initialize(pthread_mutex_t*)':
main.cpp:(.text._ZN9LogWriter10initializeEP15pthread_mutex_t[LogWriter::initialize(pthread_mutex_t*)]+0x7): undefined reference to `LogWriter::mutex'
Simpplified类代码:
class LogWriter{
static pthread_mutex_t mutex;
static void initialize(pthread_mutex_t *mut){
LogWriter::mutex = PTHREAD_MUTEX_INITIALIZER;
//if(pthread_mutex_init(&(LogWriter::mutex), NULL) != 0){
//init failed
//}
}
public:
static LogWriter getInstance(string module_name){
LogWriter instance(module_name);
return instance;
}
LogWriter& operator<<(string a);
};
我的问题是:为什么?我知道如果我将它定义为正常(非静态)字段,我将不会有任何问题。也搜索谷歌,但我找不到任何与此相关的材料。 另外,创建指向静态pthread_mutex的指针,并在main函数中初始化,如下所示。
答案 0 :(得分:5)
在代码中的某个源文件中,您需要添加:
static LogWriter::pthread_mutex_t mutex;
编译器不会将您的变量“放置”在任何特定的源文件中,您必须为此执行此操作。 class
声明只是告诉编译器“我将在某个地方有一个静态变量” - 但至少在理论上,变量排序和放置可以产生差异[例如,你可能有不同的目标文件产品“数据“在一些嵌入式系统中,它会进入内存的不同部分],编译器将无法将它放在它喜欢的任何地方 - 这可能是你不想要的地方。