У меня есть три файла: myh.h; my.cpp; use.cpp. Вот содержимое файлов:
myh.h
extern int foo;
void print_foo();
void print(int);
my.cpp
#include "myh.h"#include <iostream>
void print_foo()
{
std::cout<<foo<<std::endl;
}
void print(int i)
{
std::cout<<i<<std::endl;
}
use.cpp
#include "myh.h"int main()
{
foo=7;
print_foo();
print(99);
return 0;
}
GCC выдает следующую ошибку:
my.o:my.cpp:(.text+0x7): undefined reference to `foo'
use.o:use.cpp:(.text+0x10): undefined reference to `foo'
collect2: ld returned 1 exit status
Я компилирую файлы с помощью команды -c, и она не выдает ошибок. Я связываю с помощью следующей команды:
g++ -o final my.o use.o
В чем тут проблема, я читаю другие темы с похожими проблемами, а случай тут просто странный …..
Для любопытных это упражнение из книги Страуструпа «Принципы программирования на C ++»
Редактировать: Я сделал, как сказал dasblinkenlight, и в use.cpp я добавил int перед foo (так что теперь foo определен), но я все еще получаю эту ошибку:
my.o:my.cpp:(.text+0x7): undefined reference to `foo'
collect2: ld returned 1 exit status
Что говорит мне, что это не определено в my.cpp также? Если мне нужно определить его везде, какой смысл включать его в заголовочный файл или как к нему следует подходить более уместно?
Вы получаете ошибку компоновщика, потому что вы объявленный foo
но ты никогда определенный Это.
extern int foo
это только декларация; это не вызывает выделения памяти для foo
переменная, только обещает, что вы будете делать это в каком-то другом месте. Чтобы это исправить, вам нужно добавить эту строку в один из файлов cpp, например так:
#include "myh.h"int foo;
int main()
{
foo=7;
print_foo();
print(99);
return 0;
}
Проблема в том, что foo
объявлен, но не определен. Вам нужно определить foo
ровно в одной из единиц перевода, например:
int foo = 0;