C 从库访问可执行文件中定义的全局变量时发生重新定义错误

C 从库访问可执行文件中定义的全局变量时发生重新定义错误,c,linux,gcc,ubuntu-16.04,C,Linux,Gcc,Ubuntu 16.04,我有一个静态库文件(lib_XXX.a),其中定义了全局变量。我正在尝试访问可执行文件(exe\u XXX.o)中的全局变量。 链接器错误即将出现。任何帮助都是感激的 Languae : c OS : Ubuntu gcc compiler 样本如下 exe_xxx.o模块有两个文件resource.h和main.c resource.h代码如下: #ifndef RESOURCE_H #define RESOURCE_H #define APL extern const StructTe

我有一个静态库文件(
lib_XXX.a
),其中定义了全局变量。我正在尝试访问可执行文件(
exe\u XXX.o
)中的全局变量。 链接器错误即将出现。任何帮助都是感激的

Languae : c
OS : Ubuntu gcc compiler
样本如下

exe_xxx.o
模块有两个文件
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"
....
....
....
#include "resource.h"

int main()
{
#if defined(APL)
     fun1(g_AplObjDef);
#endif
}
lib_xxx.a
中还有另一个
main.c
。其示例代码如下:

#include "resource.h"
....
....
....
#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,
    ....
};
是定义,不应位于标题中。移到 一个
.c
文件


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

这里您是在头文件中定义一个变量

 const StructTest g_AplObjDef = 
你应该只声明,这是你之前做的。 这个定义应该放在一个代码文件中,通过头部声明提供的知识可以访问它。但是标头中的定义将在包含它的每个代码文件中执行,这会导致错误消息中提到的冗余定义

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


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

我没有看到您以全文和文本形式逐字引用错误。您在标题中定义了一个变量,应该只声明。我是否正确理解您有两个
main()
?或者仅仅是文件名误导了我?只声明将此
const StructTest g_AplObjDef
更改为
extern const StructTest g_AplObjDef;
。然后将定义部分移到代码文件中。是否有特定的原因尝试定义
main()
在lib中而不是在main.c中?我不习惯这样做。感谢您确认我的评论。对于回答,我希望有一个解决方案建议,但是…我感谢您编辑以提供解决方案建议。但是,与我以前的现有解决方案相比,您是否希望使您提供的额外见解更加明显评论?如果OP没有提供更多的信息,我想你不会比我做得更多,但这当然是一个有用的答案。