Форум программистов, компьютерный форум CyberForum.ru

Как собрать файлы в кучу? - C++

Восстановить пароль Регистрация
 
Spirit370
 Аватар для Spirit370
1 / 1 / 2
Регистрация: 08.08.2013
Сообщений: 86
28.05.2014, 18:04     Как собрать файлы в кучу? #1
В книге Страуструпа для начинающих, в 8 главе квест, на создание заголовочного файла, и два сpp файла

тк вот

В папке с заголовочными файлами файл my.h
C++
1
2
3
extern int foo;
void print_foo();
void print(int);
В папке "Файлы исходных кодов" файл my.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
#include "my.h"
#include <iostream>
using std::cout;
void print_foo()
{
    cout << foo;
}
void print(int i)
{
    cout << i;  
}
В файле use.cpp

C++
1
2
3
4
5
6
7
8
#include "my.h"
int main()
{
    int foo = 7;
    print_foo();
    print(99);
    return 0;
}
выводит ошибки:
1)Не разрешенных внешних элементов 1
2)Не разрешенный внешний символ ""int foo"(?foo@@3HA)"

В чём проблема, и как это правильно сделать?
P.S Первый раз разбиваю код на файлы
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11828 / 6807 / 769
Регистрация: 27.09.2012
Сообщений: 16,878
Записей в блоге: 2
Завершенные тесты: 1
28.05.2014, 18:07     Как собрать файлы в кучу? #2
Цитата Сообщение от Spirit370 Посмотреть сообщение
В чём проблема, и как это правильно сделать?
Ну если IDE, то добавить cpp файлы в проект

Если, например, из командной строки компилируете, то указать cpp файлы компилятору, либо уже готовые библиотеки
Spirit370
 Аватар для Spirit370
1 / 1 / 2
Регистрация: 08.08.2013
Сообщений: 86
28.05.2014, 18:15  [ТС]     Как собрать файлы в кучу? #3
Если, например, из командной строки компилируете, то указать cpp файлы компилятору, либо уже готовые библиотеки


Эээ, а как указать?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11828 / 6807 / 769
Регистрация: 27.09.2012
Сообщений: 16,878
Записей в блоге: 2
Завершенные тесты: 1
28.05.2014, 18:18     Как собрать файлы в кучу? #4
например:
g++ -o outputfilename main.cpp adv.cpp file.cpp
Spirit370
 Аватар для Spirit370
1 / 1 / 2
Регистрация: 08.08.2013
Сообщений: 86
28.05.2014, 18:22  [ТС]     Как собрать файлы в кучу? #5
это чо это? В линуксе ? Мне в виндувсе нужно как-то это откомпилировать
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11828 / 6807 / 769
Регистрация: 27.09.2012
Сообщений: 16,878
Записей в блоге: 2
Завершенные тесты: 1
28.05.2014, 18:25     Как собрать файлы в кучу? #6
Цитата Сообщение от Spirit370 Посмотреть сообщение
Мне в виндувсе нужно как-то это откомпилировать
я без понятия как Вы и чем компилируете, какие средства используете и т.д.

Добавлено через 21 секунду
Цитата Сообщение от Spirit370 Посмотреть сообщение
В линуксе ?
для MinGW тоже применимо
Spirit370
 Аватар для Spirit370
1 / 1 / 2
Регистрация: 08.08.2013
Сообщений: 86
28.05.2014, 18:25  [ТС]     Как собрать файлы в кучу? #7
Ну в визуал студии экспресс 2012 (
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11828 / 6807 / 769
Регистрация: 27.09.2012
Сообщений: 16,878
Записей в блоге: 2
Завершенные тесты: 1
28.05.2014, 18:30     Как собрать файлы в кучу? #8
Сообщение было отмечено автором темы, экспертом или модератором как ответ
ну тогда добавьте файлы cpp в проект.
а еще в my.cpp добавьте
C++
1
int foo = 0 ;
Spirit370
 Аватар для Spirit370
1 / 1 / 2
Регистрация: 08.08.2013
Сообщений: 86
28.05.2014, 18:37  [ТС]     Как собрать файлы в кучу? #9
Ееее, заработало) Спасибо, нужно ещё погуглить про extern переменные )))

Добавлено через 3 минуты
Аааа! Я узрел реальную мою ошибку

Я иннициализировал глобальную переменную внутри функции main
C++
1
2
3
4
5
6
7
8
#include "my.h"
int main()
{
    int foo = 7;
    print_foo();
    print(99);
    return 0;
}
А нужно было так, тогда всё стопудово точно работает
C++
1
2
3
4
5
6
7
8
#include "my.h"
 int foo = 7;
int main()
{
    print_foo();
    print(99);
    return 0;
}
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11828 / 6807 / 769
Регистрация: 27.09.2012
Сообщений: 16,878
Записей в блоге: 2
Завершенные тесты: 1
28.05.2014, 18:44     Как собрать файлы в кучу? #10
Цитата Сообщение от Spirit370 Посмотреть сообщение
Я иннициализировал глобальную переменную внутри функции main
Цитата Сообщение от Spirit370 Посмотреть сообщение
C++
1
2
3
4
5
int main()
{
    int foo = 7;
//...
}
Вы создали НОВУЮ переменную в main
Цитата Сообщение от Spirit370 Посмотреть сообщение
тогда всё стопудово точно работает
Цитата Сообщение от Spirit370 Посмотреть сообщение
C++
1
2
3
4
5
int foo = 7;
int main()
{
//...
}
тогда уберите int foo ; из второго cpp

Добавлено через 3 минуты
Область видимости и время жизни
Руководство новичка по эксплуатации компоновщика
Spirit370
 Аватар для Spirit370
1 / 1 / 2
Регистрация: 08.08.2013
Сообщений: 86
28.05.2014, 21:13  [ТС]     Как собрать файлы в кучу? #11
А какой смысл тогда в этом
C++
1
extern int foo;
Что это extern делает?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.05.2014, 21:33     Как собрать файлы в кучу?
Еще ссылки по теме:

Чем дальше в лес, тем больше дров. Не соображу, как собрать в кучу C++
C++ Требуется собрать кучу object в один контейнер и искать их по object_name
C++ Помогите написать кучу задач

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11828 / 6807 / 769
Регистрация: 27.09.2012
Сообщений: 16,878
Записей в блоге: 2
Завершенные тесты: 1
28.05.2014, 21:33     Как собрать файлы в кучу? #12
Цитата Сообщение от Spirit370 Посмотреть сообщение
Что это extern делает?
показывает, что переменная имеет внешнюю(external) линковку
Цитата Сообщение от Spirit370 Посмотреть сообщение
А какой смысл тогда в этом
Если просто, то extern указывает что сущность объявлена где-то в другом модуле.

при компиляции, модули компилируются отдельно(раздельная компиляция) и ничего не знают друг о друге.

Соответственно, когда компилируется файл 1.cpp, он ничего не знает о переменных и функциях в файле 2.cpp.
Поэтому, если у Вас в файле 2.cpp есть переменная X, то она будет не видна при компиляции файла 1.cpp и её нельзя будет там использовать, ведь компилятор выдаст ошибку, сославшись на необъявленный идентификатор с именем X.
Выход вроде бы очевиден - объявить переменную в файле 1.cpp
C++
1
type X ;
тогда он компилируется нормально, файл 2.cpp тоже компилируется без проблем, но на стадии линковки будет ошибка, т.к. при компиляции в каждом файле создалась переменная X и теперь у нас две переменных и линкер не знает какую выбрать.
Но, если объявить переменную X в файле 1.cpp как
C++
1
extern type X ;
то это "скажет" компилятору, что такая переменная определена где-то в другом месте и не нужно тут её создавать, так что если встретишь идентификатор с именем X, то знай, что это переменная такого то типа. Тебе этого достаточно для работы, а с местоположением данной переменной разберется линкер.

Функции по умолчанию имеют внешнюю линковку, так что в их прототипах не обязательно писать extern.
Yandex
Объявления
28.05.2014, 21:33     Как собрать файлы в кучу?
Ответ Создать тему
Опции темы

Текущее время: 23:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru