如果没有使用使用代码的链接,则对G 中的静态常规成员的不确定引用



我正在从事的项目当前由三个基本构建目标组成:

  • 核心,几乎所有类别
  • 仅包含少数测试类和主要功能的测试。他们触摸(希望)核心中的每个代码。
  • 客户端仅由一个主要函数组成,该函数用于从核心创建一个对象,并调用当前是Hello World函数。现在,主要是完全空的,它没有做任何事情来杀死错误。

仅当我构建客户端时,才会出现链接错误。它是核心中的静态恒定,看起来像这样:

class Transition
{
private:
  Transition();
  ...more declarations...
public:
  static const Transition NO_TRANSITION
  ...more declarations...
}

map.cpp中的用法:

Transition Map::searchTransition(Coordinate p, Direction d)
{
  ...code...
  return Transition::NO_TRANSITION;
}

这就是我告诉我的g :

obj/gpp/debug/game/map/map.o:map.cpp :( .rdata $ .refptr._zn10transition13no_transitione [.refptr._zn10transition13no_transitione] 0x0):未定义的引用`transition :: no_transition'

map.cpp也是核心的一部分,它包括transition.h,并且.o文件是正确的。两个相关文件之间没有正面声明。

最让我感到困扰的是:只有在我建立客户端时才发生。如果我将核心与测试类及其主链接起来,它的工作正常,这仅意味着只需要链接更多的代码。唯一删除的是一个微小甚至空的主函数,该功能被实际使用地图和过渡的更大的主函数替换。

此外,该静态常量不是新事物,并且过去从未引起问题。由于测试接受它,所以我认为一切都很好,但是显然只有测试与之链接。

我尝试在一个较小的项目中重新创建错误,而Makefile(通常)相同,但错误不会显示。我绝对不知道可能是什么重要区别。

我在cygwin下使用g 4.8与-STD = C 11。Visual Studio在没有麻烦的情况下接受相同的代码,在True Linux下,我无法测试,尽管我希望它与Cygwin相同。

有人知道这里可能会出问题吗?

编辑:发生"奇怪"行为是因为实际上有一个过渡的定义:: NO_Transition。

您仅声明它,因此没有物理位置存储数据。您应该将定义添加到过渡源,并将创建的对象文件与测试链接。

// Transition.cpp
#include "transition.h"
const Transition Transition::NO_TRANSITION;

请注意,链接器懒惰地工作,即未参考的符号,因此您未使用实际NO_TRANSITION物理位置并链接的旧代码。

您必须定义静态变量。在您的CPP中,添加此行。

static const Transition::Transition NO_TRANSITION

会做的。

最新更新