【发布时间】: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