具有头文件中的值的结构导致“重复符号”链接器错误

时间:2010-02-05 11:35:04

标签: c struct header linker

这是一个更大项目的缩减示例。你可以看到它here

我有一个包含系统时间函数限制的头文件。称之为time_config.h。

#ifndef TIME_CONFIG_H
#define TIME_CONFIG_H

#define HAS_TIMEGM

#define SYSTEM_LOCALTIME_MAX             2147483647
#define SYSTEM_LOCALTIME_MIN            -2147483648
#define SYSTEM_GMTIME_MAX                2147483647
#define SYSTEM_GMTIME_MIN               -2147483648
const struct tm SYSTEM_MKTIME_MAX = { 7, 14, 19, 18, 0, 138, 0, 0, 0, 0, 0 };
const struct tm SYSTEM_MKTIME_MIN = { 52, 45, 12, 13, 11, 1, 0, 0, 0, 0, 0 };

#endif

然后是一个定义我的时间函数的头文件。叫它mytime.h。它包括time_config.h。

#ifndef MYTIME_H
#define MYTIME_H

#include "time_config.h"

#ifndef HAS_TIMEGM
time_t timegm(const struct tm*);
#endif

#endif

mytime.c包含mytime.h,并在必要时定义timegm()。

我把它编译成目标文件......

gcc <a lot of warning flags> -I. -c -o mytime.o mytime.c

并将其链接到测试二进制文件中,t / year_limit.t.c也包含mytime.h。

gcc <a lot of warning flags> -I. mytime.o t/year_limit.t.c -o t/year_limit.t

出了哪些错误:

ld: duplicate symbol _SYSTEM_MKTIME_MAX in /var/folders/eJ/eJzTVP7oG7GVsKYHJtMprE+++TI/-Tmp-//ccMe5DXb.o and mytime.o
collect2: ld returned 1 exit status

由于time_config.h是在构建过程中由系统探测器生成的,因此将所有值保存在一个头文件中,甚至多个头文件中都非常方便。在构建过程中更改.c文件更加困难。

没有结构就可以正常工作。如何在不导致此冲突的情况下在头文件中声明最小/最大日期结构?或者我编译和链接不正确?

PS这是ANSI C89。

4 个答案:

答案 0 :(得分:5)

在标题(.h)中,您需要:

extern const struct tm SYSTEM_MKTIME_MAX;
extern const struct tm SYSTEM_MKTIME_MIN;

在您的实施(.c)中,您需要:

const struct tm SYSTEM_MKTIME_MAX = { 7, 14, 19, 18, 0, 138, 0, 0, 0, 0, 0 };
const struct tm SYSTEM_MKTIME_MIN = { 52, 45, 12, 13, 11, 1, 0, 0, 0, 0, 0 };

答案 1 :(得分:4)

const struct tm SYSTEM_MKTIME_MAX = { 7, 14, 19, 18, 0, 138, 0, 0, 0, 0, 0 };

以上声明并定义了对象SYSTEM_MKTIME_MAX;标题的多个包含导致多个定义。

在标题中加入extern并将定义放在实现文件中。

答案 2 :(得分:2)

在C常量中有外部链接,因此应在.c文件中定义。

在C ++中,它们具有内部链接,因此可以在标题中定义。

答案 3 :(得分:0)

标题必须只包含声明。所以将标题更改为:

extern const struct tm SYSTEM_MKTIME_MAX;

在cpp中进行作业

const struct tm SYSTEM_MKTIME_MAX = {...