【问题标题】:Resolve 'undefined reference' to a global external array variable将“未定义引用”解析为全局外部数组变量
【发布时间】:2021-10-17 00:05:33
【问题描述】:

我有一个标题constants.h 文件,其中包含以下数组变量声明:

extern storageCommandData storageCommands[];

数组的类型在别处定义,与问题无关。 在另一个源文件 (.c) 中,我像这样初始化了数组:

#include "constants.h"

storageCommandData storageCommands[STORAGE_COMMAND_NUM] =
    {
        /*storageCommandData intilazation follows the
          following template: {commandName, storageSize}*/
        {".db", 1},
        {".dw", 4},
        {".dh", 2},
        {".asciz", 0},
};

我尝试在另一个源文件中使用这些数组(与我在其中定义数组的文件不同),包括 constants.h

但是,当我尝试使用变量 storageCommands 时,我收到以下错误消息:

undefined reference to `storageCommands'

如何修复错误?

【问题讨论】:

  • 链接时是否包含了包含storageCommands定义的源文件或目标文件?请显示您用于编译和链接的命令行,或以其他方式说明您的构建过程。
  • 在另一个文件中包含 .h 文件是不够的。您需要将其与包含该数组的目标文件链接
  • 请先阅读this
  • 谢谢,这就是答案。我编译时没有链接定义数组的源文件
  • 名称“constants.h”似乎承诺了您可能无法交付的东西(除非 typedef storageCommandData 包含 const 限定符)。如果它不是真正的const,那么全球化是个坏主意:embedded.com/a-pox-on-globals

标签: c extern undefined-reference


【解决方案1】:

使用extern 意味着您正在使用在另一个翻译单元 中声明的变量(即基本上是一个源文件及其包含的头文件)。 链接器 的任务是将extern 指定的变量名与其实际声明相关联。如果链接器找不到后者,它将报告“未定义的引用”。

正如在 cmets 中已经指出的,这个错误的最常见原因是包含实际声明的源文件没有被编译或链接。

【讨论】:

    猜你喜欢
    • 2021-05-12
    • 1970-01-01
    • 2019-10-01
    • 2014-12-25
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    相关资源
    最近更新 更多