静态变量-未定义的引用

static variable - undefined reference

本文关键字:引用 未定义 变量 静态      更新时间:2023-10-16

今天我遇到了一个喜欢静态变量/函数的问题。首先让我展示一下代码:

Trace.h

class Trace : public QObject
{
    Q_OBJECT
public:
    explicit Trace(QObject *parent = 0);
    static void setLogFilePath(QString path)
    {
         logFilePath = path;
    }
    QString getLogFilePath();
private:
    static QString logFilePath;
};
#endif // TRACE_H

Trace.cpp

// includes.. constructors..
QString Trace::getLogFilePath()
{
    return logFilePath;
}
在Linux上,我可以编译这个类来生成一个动态库,没有任何问题。在windows上,我不能,我对logFilePath有一个未定义的引用。

我知道使用TEMPLATE = app我必须在main中定义我的静态变量,但是使用库我不这样认为,但我不确定。

我看到在windows上,它把实现放在头文件中,像这样:

Trace.h

QString Trace::getLogFilePath()
{
     return logFilePath;
}

没有点赞错误。

1)为什么Linux和Windows之间有这样的差异?(相同的Qt版本)。

2)在动态库中使用静态变量是好事还是坏事?(我可以用文件来解决这个问题,也许更好)。

链接的问题在于两者,logFilePath变量和getLogFilePath()函数。

当您将函数从.cpp文件移动到头文件时,您已经将所有类放在头文件中,使其对任何编译单元可用。这样做你不是在使用动态库,你只是在使用头文件中的类定义。

为了能够生成一个动态库,你的类隐藏在。cpp文件中,只有头文件可用,你需要告诉链接器"在外部库中搜索类"。这是通过在类定义中包含__declspec(dllexport)和__declspec(dllimport)来实现的。

你有更多的信息在这里:如何在DLL中实现类计数器?

同样,所有的静态变量必须在de .h文件之外的某个地方实例化。如vahancho所述,这是通过在.cpp文件中声明来完成的。它不需要是main.cpp文件,它应该是与类定义文件对应的。cpp文件。

最诚挚的问候,鲁本