компоновщик — C ++: связывание файлов с компилятором GCC

У меня есть три файла: 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 также? Если мне нужно определить его везде, какой смысл включать его в заголовочный файл или как к нему следует подходить более уместно?

2

Решение

Вы получаете ошибку компоновщика, потому что вы объявленный fooно ты никогда определенный Это.

extern int foo это только декларация; это не вызывает выделения памяти для foo переменная, только обещает, что вы будете делать это в каком-то другом месте. Чтобы это исправить, вам нужно добавить эту строку в один из файлов cpp, например так:

#include "myh.h"int foo;
int main()
{
foo=7;
print_foo();
print(99);
return 0;
}
8

Другие решения

Проблема в том, что foo объявлен, но не определен. Вам нужно определить foo ровно в одной из единиц перевода, например:

int foo = 0;
3

По вопросам рекламы [email protected]