静态变量 - 未定义的引用

时间:2014-06-30 11:31:23

标签: c++ qt static undefined-reference

今天我遇到了静态变量/函数的喜欢问题。首先让我告诉你代码:

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)在动态库中使用静态变量是好事还是不好? (我可以用文件克服这个问题,也许它会更好)。

提前致谢。

1 个答案:

答案 0 :(得分:4)

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

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

为了能够生成隐藏在.cpp文件中的类的动态库,并且只有可用的头文件,您需要告诉链接器“在外部库中搜索类”。这是通过将__declspec(dllexport)和__declspec(dllimport)包含在类定义中来完成的。

您有更多信息: How to implement a class counter in DLL?

此外,所有静态变量必须在de .h文件之外的某处实例化。正如vahancho所说,这是通过在.cpp文件中声明它来完成的。它不需要作为main.cpp文件,应该是与您的类定义文件对应的.cpp文件。

祝你好运, 鲁