【问题标题】:Undefined reference to member of parent class对父类成员的未定义引用
【发布时间】:2021-11-30 02:49:01
【问题描述】:

我拼命地想弄清楚我的编译器或链接器无法构建我的项目。我有一个派生自另一个类的类,并尝试访问在父类中声明为静态 constexpr 的数组。但不知何故,我收到错误“未定义对“CParent::m_array”的引用

这是一些示例代码。请考虑它是伪代码,因为它没有做任何有用的事情,而是专注于问题:

// parent.hpp
class CParent
{
protected:
    static constexpr float m_array[5] = {0, 1, 2, 3, 4};
}


// child.hpp
#include "parent.hpp"
class CChild final : public CParent
{
public:
    SomeFunction();

}

//child.cpp
#include "child.hpp"
void CChild::SomeFunction(void)
{
    if (CParent::m_array[3] == 5)
        turn_on_lead()

    return 0;
}

我认为代码实际上是正确的,问题在于链接器。我正在使用 ST 的 Cube IDE,它基本上是 eclipse。如果我通过项目属性 -> C/C++ Build-> 设置 -> MCU G++ 链接器 -> 库 -> 库搜索路径 (-L) 将路径添加到包含所有已编译 *.o 文件到链接器的调试文件夹,错误根本没有改变。

这是我得到的所有 5 个错误: Core/Src/Child.o: 在函数SomeFunction(): 发现链接错误,删除可执行文件“test.elf” mae *** [makefile:80: test.elf] 错误 1 模式阿梅尔夫 未定义对CParent::m_array的引用

任何帮助将不胜感激。我已经坚持了好几个小时了:-/

谢谢!

【问题讨论】:

  • Class 大写 C 不是标准 C++。此外,child.cpp 应该改为定义 CChild::SomeFunction。
  • 大写C的东西更像是我们自己的编码风格。你对后者是对的。我的资源中有这样的内容,并在最初的帖子中修复了它
  • 您可能应该使用 G++ 的底层版本来编辑您的问题,因为我怀疑它很古老。
  • 关于你的怀疑还有更多细节吗?我正在运行 GNU11(ISO C11 + gnu 扩展)
  • 好的。修复了大写 C 的东西 我对编译器的东西有点快。这是一个 GNU++14 ......我可以并且可能应该使用 GNU++17 ......这将错误减少到“模式 armelf”一个???

标签: c++ static constexpr member undefined-reference


【解决方案1】:

问题出在编译器版本上。我运行了 Help -> Check for Update 并更新了工具链。

感谢 Botje 和 Scheff's Cat 关于编译器版本的建议。 当然还要感谢花时间阅读和回答的每个人!真的很感激!

【讨论】:

    猜你喜欢
    • 2021-07-10
    • 1970-01-01
    相关资源
    最近更新 更多