从库访问可执行文件中定义的全局变量时出现重定义错误
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.h
和 main.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()
可能会给您带来麻烦,我只将这个答案集中在变量的双重定义上。
我有静态库文件(lib_XXX.a
),其中定义了全局变量。
链接器错误即将到来。任何帮助将不胜感激。
Languae : c
OS : Ubuntu gcc compiler
示例如下
exe_xxx.o
模块有 2 个文件 resource.h
和 main.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()
可能会给您带来麻烦,我只将这个答案集中在变量的双重定义上。