gpt4 book ai didi

c++ - 如果未链接使用代码,则未定义对 g++ 中静态常量成员的引用

转载 作者:行者123 更新时间:2023-11-28 00:16:28 28 4
gpt4 key购买 nike

我目前正在从事的项目包括三个基本构建目标:

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

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

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 文件就在它们预期的位置。两个涉及的文件之间没有前向声明。

最让我困扰的是:只有在我构建客户端时才会发生这种情况。如果我将核心与测试类及其主要链接起来,它会工作得很好,这意味着只需要链接更多的代码。唯一删除的是一个很小的甚至是空的主函数,它被一个更大的实际使用 Map 和 Transition 的函数所取代。

此外,static const 不是新的,过去从未引起过问题。由于测试接受它,我会认为一切都很好,但显然只有测试链接到它。

我已经尝试在一个较小的项目中重现错误,生成文件(大部分)相同,但错误不会出现。我完全不知道重要的区别是什么。

我在 cygwin 下使用 g++ 4.8 和 -std=c++11。 Visual Studio 可以毫无问题地接受相同的代码,在真正的 linux 下我还不能测试,尽管我希望它与 cygwin 相同。

有人知道这里可能出了什么问题吗?

编辑:“奇怪”行为的发生是因为在测试中实际上有一个 Transition::NO_TRANSITION 的定义。

最佳答案

您只是声明了它,因此没有存储其数据的物理位置。您应该将定义添加到您的转换源并将创建的目标文件与您的测试链接起来。

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

请注意,链接器以某种方式延迟工作,即不会搜索您未引用的符号,因此未使用实际 NO_TRANSITION 物理位置的旧代码编译和链接正常。

关于c++ - 如果未链接使用代码,则未定义对 g++ 中静态常量成员的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30002249/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com