如果没有使用使用代码的链接,则对G 中的静态常规成员的不确定引用
Undefined reference to static const member in g++ if no using code is linked
我正在从事的项目当前由三个基本构建目标组成:
- 核心,几乎所有类别
- 仅包含少数测试类和主要功能的测试。他们触摸(希望)核心中的每个代码。
- 客户端仅由一个主要函数组成,该函数用于从核心创建一个对象,并调用当前是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
会做的。
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- #为""定义宏;静态";针对不同的上下文
- cmake如何在fedora工作站中找到boost静态库包
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 将公共但非静态的成员函数与ALGLIB集成
- cmake在我的项目中所需的所有静态库都不成功
- C++从另一个类访问公共静态向量的正确方法是什么
- 基于boost的程序的静态链接——zlib问题
- 在静态库中嵌入类方法
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 如何在C++中获得"静态纯虚拟"功能?
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 私有类型的静态常量成员
- 使用gcc从静态链接的文件中查找可选符号
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 在C++中,为什么使用静态类函数而不是常规函数?
- 如何初始化堆,以便静态构造函数可以在常规 MFC dll 中使用堆?
- CPP中的私有静态常规成员变量与const变量
- 静态常规缓存结果
- 如果没有使用使用代码的链接,则对G 中的静态常规成员的不确定引用