【问题标题】:Linker error with global variables in .h files.h 文件中的全局变量的链接器错误
【发布时间】:2014-03-09 20:10:17
【问题描述】:

我有以下 .h 文件

#ifndef _EXCEPTION_H
#define _EXCEPTION_H

...

const char* _ErrorCode[] = {
    "%s",
    "Error: Index is out of range.",
    "Error: Stack is empty.",
    "Error: New matrix size is not greater than current one.",
    "Error: Index or size cannot be negative.",
    "Error: Method option is not within permissible options."
    "Error: File could not be found or created."
    "Error: There was not enough memory to allocate container."
                       }; // Error code list

...

#endif

包含在许多文件中。但是当我尝试编译时,出现以下链接器错误:

4 warnings generated.
duplicate symbol __ErrorCode in:
    exception.o
    graph.o
duplicate symbol __ErrorCode in:
    exception.o
    io.o
duplicate symbol __ErrorCode in:
    exception.o
    list.o
duplicate symbol __ErrorCode in:
    exception.o
    matrix.o
duplicate symbol __ErrorCode in:
    exception.o
    stack.o

这意味着编译器正在重新定义包含 exception.h 的所有文件中的 _ErrorCode 全局变量,即使文件开头有 #ifndef。我如何阻止这种情况发生?如果我不能,我如何定义一个只读字符串数组,以便在出现此类错误时打印?

【问题讨论】:

  • 你需要在header(extern)中声明,并且在一个.c文件中只定义一次

标签: c global-variables header-files


【解决方案1】:

如果您在 exception.c、graph.c、io.c 和项目中的所有其他 C 源文件中使用 #include "exception.h",则相当于将 exception.h 的内容复制到每个 C 源文件。

这意味着在每个 C 源文件中,都定义了一个 _ErrorCode 变量。当每个 C 源文件中的目标文件被链接时,由于每个目标文件中都定义了__ErrorCode,所以这是一个命名冲突。

解决方案是按照 Dabo 的建议使用 extern - 如果您在头文件中使用 extern const char* __ErrorCode[];,那么每个目标文件都会知道在别处定义的 __ErrorCode 变量。然后,您可以在 exception.c 中定义变量。在链接过程中,extern 变量将全部解析为 exception.c 中定义的__ErrorCode

【讨论】:

    【解决方案2】:

    据我了解,链接器不喜欢在 .h 文件中初始化全局变量,因为它认为它们是在文件的每个实例中重新定义的。 解决办法是让

    extern const char* _ErrCode[];
    

    然后在.c上做

    const char* _ErrCode[] = {...}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-09
      • 1970-01-01
      • 2021-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多