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;
Другие вопросы по тегам