从库访问可执行文件中定义的全局变量时出现重定义错误

Redefinition error while accessing a global variable defined in executable from library

我有静态库文件(lib_XXX.a),其中定义了全局变量。 链接器错误即将到来。任何帮助将不胜感激。

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): 这里先定义

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

这部分:

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

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

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

这里你在header

中定义了一个变量
 const StructTest g_AplObjDef = 

你应该只声明你之前做过的那一行。 该定义应放入代码文件中,可以通过 header 中的声明提供的知识访问它。但是header中的定义会在包含它的每个代码文件中完成,这会导致错误消息中提到的冗余定义。

移动定义(正如您现在在 header 中所拥有的那样,将 {...} 包括到 libs 代码文件中应该会有所帮助。

请注意,有两个 main() 可能会给您带来麻烦,我只将这个答案集中在变量的双重定义上。