【问题标题】:Linker error when using static members使用静态成员时的链接器错误
【发布时间】:2011-12-23 04:20:14
【问题描述】:

我在 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 出了什么问题/遇到过类似的问题吗?

【问题讨论】:

标签: c++ qt cmake linker-errors static-members


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多