Я пишу небольшой студенческий проект и застрял в проблеме, что у меня есть несколько глобальных переменных, и мне нужно использовать его в нескольких исходных файлах, но я получаю сообщение об ошибке * undefined для переменной_имя *. Позвольте создать три исходных файла, например:
tst1.h:
extern int global_a;
void Init();
tst1.cpp:
#include "tst1.h"
void Init(){
global_a = 1;
}
tst2.cpp:
#include "tst1.h"
int main(){
Init();
}
Когда я компилирую и связываю, что я получаю:
$ g++ -c tst1.cpp
$ g++ -c tst2.cpp
$ g++ tst2.o tst1.o
tst1.o: In function 'Init()':
tst1.cpp:(.text+0x6): undefined reference to 'global_a'
collect2: error: ld returned 1 exit status
Если я удалю extern выражение, то я получаю другую проблему, позвольте мне показать:
$ g++ -c tst1.cpp
$ g++ -c tst2.cpp
$ g++ tst2.o tst1.o
tst1.o:(.bss+0x0): multiple definition of 'global_a'
tst2.o:(.bss+0x0): first defined here
collect2: error: ld returned 1 exit status
Но мне действительно нужно, чтобы переменные были глобальными, например, мой маленький проект работает с кодом сборки и имеет переменные, такие как строка rax = "% rax% eax% ax% ah% al"; на которые должны ссылаться различные исходные файлы.
Итак, как правильно инициализировать глобальные переменные?
Вы только объявили переменную, но не определили ее. Эта запись
extern int global_a;
является декларацией, а не определением. Чтобы определить его, вы могли бы в любом модуле писать
int global_a;
Или было бы лучше определить функцию init следующим образом
int Init { /* some code */; return 1; }
и в основном модуле перед началом функции main
int global_a = Init();
tst1.cpp:2:5: error: redefinition of 'int global_a
.
tst1.cpp
должен читать вместо этого:
#include "tst1.h"
int global_a = 1;
void Init(){
}
Вы также можете написать строку инициализации как:
int global_a(1);
Или в С++ 11:
int global_a{1};
Глобальный должен быть определен (т.е. Написан без extern
префикса) в одном исходном файле, а не в файле заголовка.
tst1.cpp:2:5: error: redefinition of 'int global_a' int global_a = 33; ^ In file included from tst1.cpp:1:0: tst1.h:1:5: error: 'int global_a' previously declared here int global_a; ^
tst1.cpp:2:5: error: redefinition of 'int global_a'
вам нужно добавить
#ifndef TST1_H
#define TST1_H
.....
#endif
до tst1.h. он дважды включался в tst2.cpp
string rax = "%rax %eax %ax %ah %al";
должны быть ссылки через разные исходные файлы.