我在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有类似的问题?
答案 0 :(得分:7)
您需要在cpp文件中定义静态变量,而不是在头文件中。如果在头文件中定义它,那么包含此头文件的每个cpp文件都将获得自己的副本,因此链接器会抱怨重复的符号。
答案 1 :(得分:3)
Static data members must be explicitly defined in exactly one compilation unit
请参阅此链接:http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.12