【问题标题】:C++ static const multiple declaration error in Eclipse for Android NDKEclipse for Android NDK 中的 C++ 静态 const 多重声明错误
【发布时间】:2011-09-02 10:52:21
【问题描述】:

我已经阅读了类似的问题,但回答我的问题仅适用于 VisualStudio。我正在使用 Eclipse 并使用 Cocos2d-X 开发一个 Android 应用程序,这是一个使用 Android NDK 的框架。我创建了一个名为 Config 的类,其中包含所有应用程序的常量,例如球的大小和 fps。下面是我如何安排代码。

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):`

前面的错误发生在所有声明的常量上。我没有在任何报告的源文件的源代码中包含 Config.cpp。

我不知道如何纠正这个问题。我发现了一个非常相似的问题,但答案是针对微软的 VisualStudio 指定的。另外,我很抱歉使用“cocos2d”标签,即使这适用于 cocos2d-X,但我希望有人知道如何解决这个问题。

【问题讨论】:

  • 它看起来不像多个定义。看起来没有定义。在 Config.h 中尝试 static const double gravity = 9.8; 而不是 static const double GRAVITY = 9.8; 或者 #define GRAVITY gravity 在某处完成?
  • ::GRAVITYConfig::gravity 有什么关系?这不可能是您的实际代码...
  • 对不起,我没有注意,所以我没有注意到我的示例代码有误。请放心,我的真实代码符合所有命名约定。我更正了我的示例,它们反映了我的真实代码的样子。如果我使用了不正确的名称,我可能不会通过编译器检查。

标签: c++ eclipse android-ndk-r5 cocos2d-x


【解决方案1】:

在您的情况下,名称不匹配。您声明为 gravity,在 cpp 中声明为 GRAVITY

编辑:编辑后,除非您在 Ball.cpp/h 文件中也定义了 GRAVITY,否则我在您的代码中看不到任何链接错误。

【讨论】:

  • 它们应该在声明它们的地方初始化,但它们仍然必须在外部定义。
  • static const double gravity = 9.8 甚至无法编译。该标准仅允许对 static const int 成员进行类内初始化。定义为still required if you use the member
  • @iammilind : gcc 支持很多非标准扩展。我认为这也是其中之一。
  • @iammilind :如果您认为我错了,您可以创建另一个线程。 AFAIK static const double 成员不能在类中初始化。非数组 POD 类型和整数常量是两个完全不同的东西...... :)
  • @Prasoon: 。该标准允许对 any 整型成员进行类内初始化,而不仅仅是 int。只需将其声明为static const integral_type
【解决方案2】:

可能发生错误的唯一方法是包含 .cpp 文件。否则,您的代码完全符合标准。毕竟,错误意味着常量是在Ball.o 中定义的,除非您包含 cpp,否则我认为这不太可能。

【讨论】:

  • 我没有包含任何 cpp 文件。我只包含了 Config.h 头文件。
  • @anonymous:错误很清楚地表明,在“Ball.cpp”文件中,您定义了这些常量。去看看吧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-14
  • 1970-01-01
  • 2016-12-19
  • 2012-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多