今天我遇到了静态变量/函数的喜欢问题。首先让我告诉你代码:
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)在动态库中使用静态变量是好事还是不好? (我可以用文件克服这个问题,也许它会更好)。
提前致谢。
答案 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文件。
祝你好运, 鲁