c++ - 使用静态成员时出现链接器错误

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

我在 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 文件都将获得自己的拷贝,因此链接器会提示重复符号。

关于c++ - 使用静态成员时出现链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8612206/

相关文章:

c++ - 3dsmax SDK c++ bonesdef.h

c++ - qt图表等轴(轴应该形成正方形而不是矩形)

qt - 如何在 Meego 中以编程方式模拟触摸事件?

python - QStandardItem 缺少 __hash__ 方法

c++ - 在 Cmake 中将 flto=jobserver 传递给 gcc

linux - 如何让 CMake 在系统 PATH 上使用默认编译器?

c++ - 如何使用 CMake 设置 MSVC 目标平台版本?

c++ - #pragma pack 在 C++ 中

c++ - Qt:按下按钮时显示多个窗口

c++ - 使用 gcc 链接库在 Ubuntu 中编译 C++ 代码