2013-10-10 7 views
7

dispiace se questa è una domanda ripetuta, ma ho cercato in giro per un paio d'ore, e sto ricevendo risposte contrastanti ... e quel che è peggio, nessuno di loro stanno lavorando.Eclipse/GCC: undefined reference to EXTERN variabile

È una questione semplice. Ho molti file sorgente e ho alcuni parametri comuni che voglio essere in un singolo file, ad esempio "Parameters.h". Voglio impostare questi parametri (una volta) in fase di esecuzione, passandoli come argomenti al programma.

PS: So che un modo migliore di farlo è quello di passare tutto come argomenti di funzioni, ma è un pezzo grosso di codice e ho bisogno di ottenere un risultato ben presto senza fare troppi cambiamenti.

Ecco un minimo esempio di funzionamento:

Parameters.h

#ifndef PARAMETERS_H_ 
#define PARAMETERS_H_ 

extern int Alpha; 

#endif 

main.cpp

#include <iostream> 
#include "Parameters.h" 

int main(int argc, char * argv[]) 
{ 
    const int Alpha = 12.0; 
} 

Functions.cpp

#include "Parameters.h" 

double Foo(const double& x) 
{ 
    return Alpha*x; 
} 

Quando compilo con

gcc main.cpp Functions.cpp 

ottengo l'errore "Functions.cpp :(testo + 0xa):. Undefined reference to` Alpha '".

risposta

17

È stata dichiarata una variabile globale chiamata Alpha, ma non hanno definito. In esattamente un file sorgente, scrivere nell'ambito di file:

int Alpha; 

o con un inizializzatore:

int Alpha = 42; 

Si noti che la variabile locale denominata Alpha aver definito entro main è distinta e completamente estranei a questa variabile globale.

+0

Grazie mille! Il problema era, come dici tu, che non stavo definendo Alpha nello scope del file in main.cpp. Ora mi sento un idiota :-) Grazie ancora. – MGA

+0

è necessario definire Alpha come 'extern 'considerando che la dichiarazione si trova in un file di intestazione? – ldgorman

+1

@ldgorman: Se non si utilizza 'extern', quindi sarebbe una definizione, non solo una dichiarazione. Se quindi includi questa intestazione in più di un file sorgente, verrebbero visualizzati errori di linker relativi a più definizioni dello stesso simbolo. –