Ошибка компоновщика при использовании статических членов - PullRequest
3 голосов
/ 23 декабря 2011

Я использую Qt 4.7 и Cmake 2.8.3 с g ++ 4.2.1 на Mac OS X.

Я получаю странную ошибку компоновщика при использовании статических или глобальных переменных в одном из моих файлов. Вот ошибка:

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

convertColorUniformLocation является статическим членом класса 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?

Ответы [ 2 ]

7 голосов
/ 23 декабря 2011

Вам необходимо определить статическую переменную в файле cpp, а не в заголовочном файле. Если вы определите его в заголовочном файле, каждый файл cpp, который включает этот заголовок, получит свою собственную копию, поэтому компоновщик жалуется на дубликаты символов.

3 голосов
/ 23 декабря 2011

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

См. Ссылку: http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.12

...