Logger.h:
class Logger {
private:
Logger();
static void log(const string& tag, const string& msg, int level);
static Mutex mutex;
public:
static void fatal(const string&, const string&);
static void error(const string&, const string&);
static void warn(const string&, const string&);
static void debug(const string&, const string&);
static void info(const string&, const string&);
};
Logger.cpp:
#include "Logger.h"
#include <sstream>
ofstream Logger::archivoLog;
void Logger::warn(const string& tag, const string& msg){
Logger::mutex.lock();
log(tag, msg, LOG_WARN);
Logger::mutex.unlock();
}
编译时,我收到此错误:
other/Logger.o: In function `Logger::warn(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
Logger.cpp:(.text+0x9): undefined reference to `Logger::mutex'
Logger.cpp:(.text+0x3b): undefined reference to `Logger::mutex'
答案 0 :(得分:4)
在C ++中的类声明中使用静态成员时,还需要在源文件中定义它,因此在您的情况下需要添加logger.cpp
:
Mutex Logger::mutex; // explicit intiialization might be needed
为什么会这样?这是因为在C ++中,与C类似,您必须“告诉”编译器在哪个编译单元中放置实际变量。头文件中的声明只是一个声明(与函数声明的方式相同)。 另请注意,如果将实际变量放在头文件中,则会出现不同的链接错误。 (由于此变量的多个副本将放置在包括该头文件的任何编译单元中)
答案 1 :(得分:2)
需要定义静态成员,包括变量。所以在cpp文件的某处,添加:
Mutex Logger::mutex;