C++ undefined reference (static member)
Возможный дубликат:
/questions/4538256/neopredelennaya-ssyilka-na-staticheskij-chlen-klassa
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'
2 ответа
Когда вы используете статический член в объявлении класса в C++, вам также нужно определить его в исходном файле, поэтому в вашем случае вам нужно добавить в logger.cpp
:
Mutex Logger::mutex; // explicit intiialization might be needed
Это почему? Это потому, что в C++, как и в C, вы должны "указать" компилятору, в какой модуль компиляции поместить фактическую переменную. Объявление в заголовочном файле является только объявлением (так же, как и объявление функции). Также обратите внимание, что если вы поместите фактическую переменную в заголовочный файл, вы получите другую ошибку компоновки. (Поскольку несколько копий этой переменной будут помещены в любой модуль компиляции, включая этот заголовочный файл)
Статические члены, включая переменные, должны быть определены. Итак, где-нибудь в вашем файле cpp, добавьте это:
Mutex Logger::mutex;