Ho il seguente "costanti" intestazione:Collegamento edizione con "la definizione multiplo di" errore di compilazione
/* 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
Sono #include
-ing questa intestazione nel file X.c
e Y.c
.
Nota che sono non incluso questo in X.h
o Y.h
.
I file X.c
e Y.c
vengono compilati in file oggetto archiviati in una libreria statica denominata libXY.a
.
Quando includo X.h
e Y.h
in Z.h
, e quando mi collego a libXY.a
, non riesco a compilare Z.c
senza errori:
/* Z.h */
#include "X.h"
#include "Y.h"
io ottenere i seguenti errori di compilazione quando si tenta di compilare 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
Ho provato a impostare kFoo
e kBar
a extern
, ma questo non aiuta
Come risolvere più definizioni, quando includo le costanti solo una volta (tramite la protezione dell'intestazione #ifndef CONSTANTS_H
)?
Forse non è il problema immediato (non sono sicuro), ma è necessario rimuovere il falso '#pragma once' e metti le tue guardie multiple-inclusive nella tua intestazione. Il formato standard è '#ifndef MYHEADER_H #define MYHEADER_H .... # endif' –