C++未定义引用(静态成员)

3

可能重复:
C++:未定义静态类成员的引用

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'

https://dev59.com/-XVC5IYBdhLWcg3wykQt - SomeWittyUsername
更好的答案:https://dev59.com/WXVC5IYBdhLWcg3whBWj#272965 - mvp
2个回答

8

在C++类声明中使用静态成员时,您还需要在源文件中定义它。因此,在您的情况下,您需要在logger.cpp中添加:

Mutex Logger::mutex; // explicit intiialization might be needed

为什么会这样呢? 这是因为在C++中,与C类似,你必须"告诉"编译器要将实际变量放在哪个编译单元中。头文件中的声明只是一个声明(就像函数声明一样)。 还请注意,如果将实际变量放在头文件中,你将得到不同的链接错误。(因为此变量的多个副本将被放置在包括该头文件的任何编译单元中)


3

静态成员(包括变量)需要进行定义。因此,在cpp文件中的某个地方添加以下内容:

Mutex Logger::mutex;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接