问题:变量'VarOriginal'在源C文件中的pragma中定义为'parameterX',并在同一个pragma'parameterX'下的头文件中声明为extern变量。有一个使用它的过程,其中已知变量显示在一些其他头文件中声明,其中该变量根本不存在。
作为一种解决方法:我在头文件中的编译指示'parameterX'之前声明了另一个不同的变量'VarNew',并且在定义'VarOriginal'的行之前类似地定义了变量'VarNew'。这一切都奏效了。
header_file_with_problem.h
#ifndef HEADER_FILE_WITH_PROBLEM_H
#define HEADER_FILE_WITH_PROBLEM_H
#include "ABC.h"
在这里声明变量'VarNew'< ------
#pragma BSS(".parameterX")
extern int VarOriginal;
#pragma BSS(DEFAULT_SECTION_BSS)
#define HEADER_FILE_WITH_PROBLEM_C
#include "XYZ.h"
#include "header_file_with_problem.h"
在这里声明变量'VarNew'< ------
#pragma BSS(".parameterX")
int VarOriginal;
#pragma BSS(DEFAULT_SECTION_BSS)
但我无法理解为什么问题早些出现。为什么链接器无法在源文件中找到'VarOriginal'的定义,现在能够在'VarOriginal'本身之前声明另一个变量后才能这样做?
此外,此问题不是文件夹中存在的所有源文件和头文件,而只是其中的一小部分。
答案 0 :(得分:2)
我在源文件中看不到任何定义的。在
extern int VarOriginal;
仍然是非定义声明,无论您放在何处(源文件或头文件)。您的代码示例中没有单个变量定义,因此难怪链接器抱怨缺少定义。
为了定义 C文件中的变量,您需要执行
int VarOriginal; /* no `extern` !!! */
或添加显式初始值设定项
extern int VarOriginal = 0; /* definition */
仅仅
extern int VarOriginal; /* not a definition!!! */
你现在似乎在那里(根据你发布的内容)不是一个定义。