使用静态成员时链接器错误

Linker error when using static members

本文关键字:错误 链接 静态成员      更新时间:2023-10-16

我在Mac OS x上使用Qt 4.7和Cmake 2.8.3与g++ 4.2.1。

当在我的一个文件中使用静态或全局变量时,我得到一个奇怪的链接器错误。下面是错误:

ld: duplicate symbol ColorTrail::calculateColorUniformLocation        in CMakeFiles/GLBall.dir/src/DesktopMain.cpp.o and CMakeFiles/GLBall.dir/src/ColorTrail.cpp.o
collect2: ld returned 1 exit status

calculateColorUniformLocation是ColorTrail类的静态成员…但它甚至没有在DesktopMain.cpp中使用!

这是我尝试过的:重命名变量并不能解决问题。将变量移出类并使其成为一个普通的全局变量也不能修复它

文件ColorTrail.h:

#ifndef COLORTRAIL
#define COLORTRAIL 9
#include "GlobalConstants.h"
#include <vector>
using namespace std;

class ColorTrail
{
private:
    //note that this is NOT a Q_OBJECT
    static GLint calculateColorUniformLocation;
    //omitted for brevity
};
GLint ColorTrail::calculateColorUniformLocation;

#endif

DesktopMain.cpp使用ColorTrail类,但不是静态的,也从不引用该变量。

有人知道什么可能是错的/有一个类似的问题与Qt?

您需要在cpp文件中定义静态变量,而不是在头文件中。如果你在头文件中定义它,每个包含这个头文件的cpp文件都会得到自己的副本,因此链接器会抱怨重复的符号。

Static data members must be explicitly defined in exactly one compilation unit

查看此链接:http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.12

相关文章: