我正在从事的项目当前由三个基本构建目标组成:
- 核心,几乎所有类别
- 仅包含少数测试类和主要功能的测试。他们触摸(希望)核心中的每个代码。
- 客户端仅由一个主要函数组成,该函数用于从核心创建一个对象,并调用当前是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
会做的。