头文件中的外部变量未正确链接到定义它的源文件

时间:2011-09-29 22:10:04

标签: c header linker extern

问题:变量'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)

来源C档案:

#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'本身之前声明另一个变量后才能这样做?

此外,此问题不是文件夹中存在的所有源文件和头文件,而只是其中的一小部分。

1 个答案:

答案 0 :(得分:2)

我在源文件中看不到任何定义的。在

extern int VarOriginal;

仍然是非定义声明,无论您放在何处(源文件或头文件)。您的代码示例中没有单个变量定义,因此难怪链接器抱怨缺少定义。

为了定义 C文件中的变量,您需要执行

int VarOriginal; /* no `extern` !!! */

或添加显式初始值设定项

extern int VarOriginal = 0; /* definition */

仅仅

extern int VarOriginal; /* not a definition!!! */

你现在似乎在那里(根据你发布的内容)不是一个定义。