2011-05-26 7 views
1

Я читал подобные вопросы, но тот, который отвечает мне, относится только к VisualStudio. Я использую Eclipse и разрабатываю приложение для Android с использованием Cocos2d-X, который является базой, использующей NDK для Android. Я создал класс с именем Config, который содержит все константы приложения, такие как размеры шара и fps. Ниже я описал код.C++ static const множественная ошибка объявления в Eclipse для Android NDK

config.h

#ifndef __CONFIG_H_ // this was auto-generated by eclipse 
#define __CONFIG_H_ 

class Config { 
public: 
    static const double GRAVITY; 
    static const int BALL_WIDTH; 
    static const int BALL_HEIGHT; 
} 

#endif /* config.h */ 

Config.cpp

#include "Config.h" 


const double Config::GRAVITY = 9.8; 
const int Config::BALL_WIDTH = 100; 
const int Config::BALL_HEIGHT = 100; 

Он компилируется без ошибок, но связь, когда она начинается, я получаю следующее сообщение об ошибке:

multiple definition of `Config::GRAVITY' 
C:/workspace/cocos2d-x/SampleGame/android/obj/local/armeabi/objs-debug/game/../../../Classes/Config.o:(.rodata+0xc8): first defined here 
C:/workspace/cocos2d-x/SampleGame/android/obj/local/armeabi/objs-debug/game/../../../Classes/Ball.o:(.rodata+0xcc):` 

The previo us error возникает для всех объявленных констант. Я не включил Config.cpp в исходный код любого из исходных файлов.

Я понятия не имею, как исправить это. Я нашел очень похожий вопрос, но ответ был указан в Microsoft VisualStudio. Кроме того, я прошу прощения за использование тега cocos2d, даже если это относится к cocos2d-X, но я надеюсь, что кто-то знает, как это исправить.

+0

Это не похоже на несколько определений. Похоже, нет никакого определения. Попробуйте 'static const double gravity = 9.8;' в Config.h вместо 'static const double GRAVITY = 9.8;' или '#define GRAVITY gravity' где-то делается? – Mayank

+0

Что значит ':: GRAVITY' иметь отношение к' Config :: gravity'? Это не может быть вашим реальным кодом ... – ildjarn

+0

Извините, я не обращал на это внимания, поэтому я не заметил, что мой пример кода был неправильным. Будьте уверены, мой настоящий код соответствует всем соглашениям об именах. Я исправил свои образцы, и они отражают то, как выглядит мой настоящий код. Вероятно, я бы не прошел проверку компилятора, если бы использовал неправильные имена. – cesar

ответ

0

В вашем случае имена не совпадают. Вы объявляете gravity, а в cpp - GRAVITY.

Edit: После того, как ваши изменения, я не вижу никаких ошибок соединительных в вашем коде, если вы определили GRAVITY в файле Ball.cpp/h также.

+0

Они должны быть _инициализированы_, где они объявлены, но они также должны быть определены снаружи. – ildjarn

+0

'static const double gravity = 9.8' даже не компилируется. Стандарт допускает инициализацию в классе только членов 'static const int'. Определение [все еще требуется, если вы используете элемент] (http://stackoverflow.com/questions/6106194/definition-of-static-const-outside-the-class-definition/6106240#6106240). –

+0

@ildjarn, измененный «определенный» с «инициализированным». Я использую эти взаимозаменяемые причины, поэтому эта ошибка. – iammilind

1

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

+0

У меня не было файлов cpp. Я включил только заголовочный файл Config.h. – cesar

+1

@ anonymous: Ошибка явно показывает, что в файле «Ball.cpp» вы определили эти константы. Иди посмотри. – Puppy