首页 > 解决方案 > 访问库中可执行文件中定义的全局变量时重定义错误

问题描述

我有静态库文件(lib_XXX.a),其中定义了全局变量。我正在尝试访问我的可执行文件(exe_XXX.o)中的全局变量。链接器错误即将到来。任何帮助将不胜感激。

Languae : c
OS : Ubuntu gcc compiler

示例如下

exe_xxx.o模块有2个文件resource.hmain.c

resource.h代码如下:

#ifndef RESOURCE_H
#define RESOURCE_H

#define APL

extern const StructTest g_AplObjDef;

const StructTest g_AplObjDef = {
abc, def, ghi,
....
};

#endif //APL

main.c代码如下:

#include "resource.h"
....
....
....

lib_xxx.a里面有另一个main.c。其示例代码如下:

#include "resource.h"

int main()
{
#if defined(APL)
     fun1(g_AplObjDef);
#endif
}

我怀疑原因是因为resource.h包含在两个main.c文件中。我无法摆脱这个。任何人都可以帮忙吗?

错误详情:/lib_XXX.a(lib_XXX_a-main.o):(.data.rel.ro.local+0x40): `g_AplObjDef' がして定义されています /exe_xxx-main.o:(.data. rel.ro.local+0x260): ここで最初に定义されています

上面的错误是日文的。第一行说“定义了重复”。第二行说“这里定义”

标签: clinuxgccubuntu-16.04

解决方案


这部分:

const StructTest g_AplObjDef = {
    abc, def, ghi,
    ....
};

是一个定义,不应该在标题中。将其移动到.c文件中。

原因是头文件是文本插入的,所以如果一个头文件有定义,并且包含在多个翻译单元中,符号将被定义多次,这是一个错误。


推荐阅读