c - 访问库中可执行文件中定义的全局变量时重定义错误
问题描述
我有静态库文件(lib_XXX.a
),其中定义了全局变量。我正在尝试访问我的可执行文件(exe_XXX.o
)中的全局变量。链接器错误即将到来。任何帮助将不胜感激。
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,
....
};
是一个定义,不应该在标题中。将其移动到.c
文件中。
原因是头文件是文本插入的,所以如果一个头文件有定义,并且包含在多个翻译单元中,符号将被定义多次,这是一个错误。
推荐阅读
- c# - iOS 上的 PWA 应用离线缓存清除问题
- java - java.lang.RuntimeException:RESTEASY003325:无法构造公共
- goland - Goland 无法将字符串类型的表达式转换为 []byte 类型
- javascript - 如何在谷歌图表中使用javascript全局变量
- java - Android java Listview滚动自动慢了
- r - 将可变长度列表转换为R中的矩阵
- java - 物理内存为 16 GB RAM 和 8 CPU 的 Linux 上 JDK8 64 位的 JVM 堆大小 (Xms Xmx) 应该是多少
- json - 将 json 转换为数据集时如何在 json 中包含该位
- javascript - 通过AJAX页面插入刷新
- android - Tesseract(OCR) - 错误的路径在某些设备中找不到经过训练的文件