C ++未定义的引用(静态部件)[重复](C++ undefined reference (stat

2019-10-17 10:43发布

这个问题已经在这里有一个答案:

  • 静态变量链接错误 2个回答

可能重复:
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'

Answer 1:

当你在C类声明中使用静态成员++,你还需要在源文件来定义它,所以你的情况,你需要在添加logger.cpp

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

这是为什么? 这是因为在C ++中,类似于c必须“告诉”编译器在编译单元把实际的变量。 在头文件中的声明只声明(以同样的方式的函数声明)。 还要注意的是,如果你把实际的变量在头文件,你会得到一个不同的连接错误。 (由于该变量的几个拷贝将被放置在任何编译单元,其包括头文件)



Answer 2:

静态成员,包括变量,需要定义。 因此,在你的CPP文件的地方,补充一点:

Mutex Logger::mutex;


文章来源: C++ undefined reference (static member) [duplicate]