Estoy tratando de compartir la misma variable entre dos archivos .cpp, incluyen el mismo archivo .h.problemas con la variable global compartida entre los archivos de origen (estoy usando incluir guardias)
Pero recibo errores de enlace, diciéndome que tengo múltiples definiciones. Que me parece extraño, ya que estoy usando incluir guardias
//main.cpp
#include <cstdio>
#include "shared.h"
int main(){
shared_int = 5;
printVal();
return 0;
}
//shared.h
#ifndef INCLUDE_GUARD_H
#define INCLUDE_GUARD_H
#include <cstdio>
#include <cstdlib>
int shared_int;
int printVal();
#endif
//shared.cpp
#include <cstdio>
#include "shared.h"
int printVal(){
fprintf(stderr,"a: %d\n",shared_int);
return 0;
}
estoy comping como
g++ shared.cpp -c;g++ main.cpp shared.o
shared.o:(.bss+0x0): multiple definition of `shared_int'
/tmp/cci8w8Am.o:(.bss+0x0): first defined here
collect2: ld returned 1 exit status
gracias
Actualización: El todavía no funciona 'externo', pero ahora obtener una referencia indefinida Estos son los archivos actualizados
//shared.h
#ifndef INCLUDE_GUARD_H
#define INCLUDE_GUARD_H
#include <cstdio>
#include <cstdlib>
//extern "C" int shared_int;//i've tried both
extern int shared_int;
int printVal();
#endif
//shared.cpp
#include <cstdio>
#include "shared.h"
int printVal(){
fprintf(stderr,"a: %d\n",shared_int);
return 0;
}
//main.cpp
#include <cstdio>
#include "shared.h"
int main(){
int shared_int = 5;
printVal();
return 0;
}
Esta es la forma en Compilo
g++ main.cpp shared.o
shared.o: In function `printVal()':
shared.cpp:(.text+0x6): undefined reference to `shared_int'
collect2: ld returned 1 exit status
La respuesta ya está dada por Greg, pero asegúrese de entender la diferencia entre una declaración y una definición. Es una distinción importante que lo ayudará a comprender mejor los mensajes del compilador y la semántica general del código. – Nick
Su código actualizado agrega 'extern" C "' (que es algo bastante diferente de lo que sugerí en mi respuesta), y no introduce ninguna definición. Prueba lo que sugerí en mi respuesta. –
@greg Hewgill. Lo he intentado también, el mismo error de enlace.Gracias – monkeyking