链接问题与“多重定义”编译错误

时间:2012-01-28 22:49:53

标签: c header definition

我有以下“常量”标题:

/* constants.h */

#ifdef __cplusplus 
extern "C" {
#endif

#pragma once

#ifndef CONSTANTS_H
#define CONSTANTS_H

const char * kFoo = "foo";
const char * kBar = "bar";

#endif

#ifdef __cplusplus
}
#endif

#include - 在文件X.cY.c中添加此标头。

请注意,我包括X.hY.h

文件X.cY.c被编译为目标文件,这些文件存档到名为libXY.a的静态库中。

当我在X.h中加入Y.hZ.h时,以及当我链接到libXY.a时,我无法正确编译Z.c

/* Z.h */

#include "X.h"
#include "Y.h"

尝试编译Z.c时出现以下编译错误:

/path/to/libXY.a(X.o):(.data+0x0): multiple definition of `kFoo`
/path/to/libXY.a(Y.o):(.data+0x0): first defined here
/path/to/libXY.a(X.o):(.data+0x8): multiple definition of `kBar`
/path/to/libXY.a(Y.o):(.data+0x8): first defined here

我尝试将kFookBar设置为extern,但这没有帮助。

当我只包含一次常量(通过标题保护#ifndef CONSTANTS_H)时,如何解析多个定义?

2 个答案:

答案 0 :(得分:9)

  

当我只包含一次常量(通过标题保护#ifndef CONSTANTS_H)时,如何解析多个定义?

constants.h

const char * kFoo = "foo";

kFoo #include的每个翻译都会发出constants.h的定义。因此,多个定义,然后导致链接错误。

asaelr注意到(+1),你会这样解决:

constants.h

extern const char* const kFoo;

constants.c

const char* const kFoo = "foo";

(注意我也使指针const,通常你想在这种情况下做什么)

答案 1 :(得分:4)

您不应在头文件中定义变量。在其中一个源文件中定义它们,并在头文件中声明它们(extern)。

(你写过“我已经尝试过将kFoo和kBar设置为extern,但这没有帮助。”我猜你没有在源文件中定义它们)