Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не собирается после отделения интерфейса класса 
:(
    Опции темы
n199a
  Дата 2.2.2014, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.11.2011

Репутация: нет
Всего: нет



Почему проект не собирается после отделения интерфейса класса?

Ошибка при сборке:
Код


(.text+0x4a): undefined reference to `GradeBook::GradeBook(std::string)'
(.text+0x97): undefined reference to `GradeBook::GradeBook(std::string)'
(.text+0xbf): undefined reference to `GradeBook::getCourseName()'
(.text+0xd4): undefined reference to `GradeBook::getCourseName()'
collect2: ld returned 1 exit status
Сборка завершилась с ошибкой.



GradeBook.h:
Код

#include <string>
using std::string;

class GradeBook {
    public:
        GradeBook(string);    //конструктор, инициализирующий courseName
        void setCourseName(string);    //устанавливает courseName
        string getCourseName();    //получает название курса
        void displayMessage();
    private:
        string courseName;
};


GradeBook.cpp:
Код

#include <iostream>
using std::cout;
using std::endl;

#include "GradeBook.h"    //включили определение класса GradeBook

GradeBook::GradeBook(string name) {
    setCourseName(name);
}

void GradeBook::setCourseName(string name) {
    courseName = name;
}

string GradeBook::getCourseName() {
    return courseName;
}

void GradeBook::displayMessage() {
    cout << "Welcome to the"
          << getCourseName() << endl;
}



main:
Код

#include <iostream>
using std::cout;
using std::endl;

#include "GradeBook.h"

int main() {

    GradeBook gradeBook1("CS101 number 1");
    GradeBook gradeBook2("CS102 number 2");
    
    //вывести исходное значение courseName для каждого gradeBook
    cout << "Inital course name is: "
          << gradeBook1.getCourseName() << "\n"
          << gradeBook2.getCourseName() << endl;
    
    return 0;
}



PM MAIL   Вверх
vinter
Дата 2.2.2014, 07:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



GradeBook.cpp не участвует в компиляции. Проверь как ты компилируешь программу.


--------------------
Мой блог
PM MAIL WWW   Вверх
n199a
  Дата 2.2.2014, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.11.2011

Репутация: нет
Всего: нет



Цитата(vinter @  2.2.2014,  07:58 Найти цитируемый пост)
GradeBook.cpp не участвует в компиляции. Проверь как ты компилируешь программу. 


В main добавил:
Код

#include "GradeBook.cpp"


Теперь новая ошибки:
Код

In file included from fig03_13.cpp:6:0:
error: redefinition of 'class GradeBook'
error: previous definition of 'class GradeBook'
Сборка завершилась с ошибкой.


Может дело в том, что у меня Geany, а в нем нельзя создавать проекты?
Может дело в командах сборки?
Скомпилировать: 
Код

g++ -Wall -c "%f"

Сборка: 
Код

g++ -Wall -o "%e" "%f"

Выполнить: 
Код

"./%e"


Надо было создавать через меню "Проект"

Это сообщение отредактировал(а) n199a - 2.2.2014, 13:45
PM MAIL   Вверх
bsa
Дата 2.2.2014, 16:13 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



n199a, а еще надо было ставить стражи повторного включения.
PM   Вверх
n199a
  Дата 3.2.2014, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.11.2011

Репутация: нет
Всего: нет



Цитата(bsa @  2.2.2014,  16:13 Найти цитируемый пост)
n199a, а еще надо было ставить стражи повторного включения. 

На сей раз создавал через меню "Проект"
Сделал как в инструкции:
Код

#ifndef GradeBook
#define GradeBook
#include <string>
using std::string;

class GradeBook {
    public:
        GradeBook(string);    //конструктор, инициализирует название курса
        void setCourseName(string);    //для установки названия
        string getCourseName();    //для извлечения названия курса
        void displayMessage();    //привественное сообщения
    private:
        string courseName;
};
#endif



Ошибки (в инструкции приведен пример для другой ошибки):
Код

fig04_10.cpp:(.text+0x47): undefined reference to `GradeBook::GradeBook(std::string)'
fig04_10.cpp:(.text+0x6b): undefined reference to `GradeBook::displayMessage()'
fig04_10.cpp:(.text+0x77): undefined reference to `GradeBook::determineClassAverage()'
collect2: ld returned 1 exit status
Сборка завершилась с ошибкой.



Погуглив по форуму нашёл похожую тему, но в ней было связано со звуком.
http://forum.vingrad.ru/forum/topic-228960/0.html

Это сообщение отредактировал(а) n199a - 3.2.2014, 20:49
PM MAIL   Вверх
xvr
Дата 3.2.2014, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(n199a @  3.2.2014,  20:43 Найти цитируемый пост)
На сей раз создавал через меню "Проект"

Файл GradeBook.cpp не включен в проект

PM MAIL   Вверх
n199a
Дата 3.2.2014, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.11.2011

Репутация: нет
Всего: нет



Цитата(xvr @  3.2.2014,  21:11 Найти цитируемый пост)
Файл GradeBook.cpp не включен в проект

Включил #include "GradeBook.cpp" в fig04_10.cpp.
Результат:
Код

g++ -Wall -c "fig04_10.cpp"
In file included from GradeBook.cpp:11:0,
                 from fig04_10.cpp:3:
GradeBook.h:8:19: error: ISO C++ forbids declaration of 'string' with no type
GradeBook.h:9:22: error: 'string' is not a type
GradeBook.h:10:3: error: 'string' does not name a type
GradeBook.h:14:3: error: 'string' does not name a type
GradeBook.h:6:17: error: an anonymous struct cannot have function members
GradeBook.h:15:1: error: abstract declarator '<anonymous class>' used as declaration
In file included from fig04_10.cpp:3:0:
GradeBook.cpp:13:21: error: expected id-expression before '(' token
GradeBook.cpp:17:42: error: explicit qualification in declaration of 'void setCourseName(std::string)'
GradeBook.cpp: In function 'void setCourseName(std::string)':
GradeBook.cpp:19:3: error: 'courseName' was not declared in this scope
GradeBook.cpp:21:3: error: 'courseName' was not declared in this scope
GradeBook.cpp: At global scope:
GradeBook.cpp:27:1: error: specializing member 'std::basic_string<char>::getCourseName' requires 'template<>' syntax
GradeBook.cpp:31:32: error: explicit qualification in declaration of 'void displayMessage()'
GradeBook.cpp: In function 'void displayMessage()':
GradeBook.cpp:32:42: error: 'getCourseName' was not declared in this scope
GradeBook.cpp: At global scope:
GradeBook.cpp:36:39: error: explicit qualification in declaration of 'void determineClassAverage()'
GradeBook.cpp: In function 'void determineClassAverage()':
GradeBook.cpp:63:48: error: 'setprecision' was not declared in this scope
fig04_10.cpp: In function 'int main()':
fig04_10.cpp:6:48: error: 'myGradeBook' was not declared in this scope
Сборка завершилась с ошибкой.



А если убрать из GradeBook.h эти строки:
Код

#ifndef GradeBook
#define GradeBook
// здесь всё, что было раньше в заголовочном файле
#endif

то, результат:
Код

g++ -Wall -c "fig04_10.cpp"
In file included from GradeBook.cpp:11:0,
                 from fig04_10.cpp:3:
GradeBook.h:5:7: error: redefinition of 'class GradeBook'
GradeBook.h:5:17: error: previous definition of 'class GradeBook'
In file included from fig04_10.cpp:3:0:
GradeBook.cpp: In member function 'void GradeBook::determineClassAverage()':
GradeBook.cpp:63:48: error: 'setprecision' was not declared in this scope
Сборка завершилась с ошибкой.



Это сообщение отредактировал(а) n199a - 3.2.2014, 22:00
PM MAIL   Вверх
Alexeis
Дата 3.2.2014, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 4
Всего: 459



Цитата(n199a @  3.2.2014,  22:58 Найти цитируемый пост)
Включил #include "GradeBook.cpp" в fig04_10.cpp.

  cpp файлы не включают друг в друга. Они для этого не предназначены. Это иногда может сработать, но вообще это не правильно. Кроме *.cpp /*.h файлов есть еще файл проекта. Не знаю как он там в gcc называется. Вероятно это make файл. Но обычно компилятору передаются все cpp шники по отдельности и пути к хидерам. Компилятор из них создает объектные файлы. Отдельные для каждого cpp файла.  И вот эти вот объектные файлы собирает линкер. Правда линкеру еще нужно прицепить CRT и другие библиотеки, но это уже детали. Каждый cpp файл должен включать все необходимые ему заголовочные файлы. Обычно по ним линкер определяет как между собой связать объектные файлы. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
n199a
Дата 3.2.2014, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.11.2011

Репутация: нет
Всего: нет



Цитата(Alexeis @  3.2.2014,  22:53 Найти цитируемый пост)
  cpp файлы не включают друг в друга. Они для этого не предназначены. Это иногда может сработать, но вообще это не правильно. Кроме *.cpp /*.h файлов есть еще файл проекта. Не знаю как он там в gcc называется. Вероятно это make файл. Но обычно компилятору передаются все cpp шники по отдельности и пути к хидерам. Компилятор из них создает объектные файлы. Отдельные для каждого cpp файла.  И вот эти вот объектные файлы собирает линкер. Правда линкеру еще нужно прицепить CRT и другие библиотеки, но это уже детали. Каждый cpp файл должен включать все необходимые ему заголовочные файлы. Обычно по ним линкер определяет как между собой связать объектные файлы.  

У меня включает же. Почему этот Geany не собирает?
Может в make дописать что-то надо?
PM MAIL   Вверх
xvr
Дата 4.2.2014, 08:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(n199a @  3.2.2014,  23:07 Найти цитируемый пост)
Может в make дописать что-то надо? 

Именно. Если делать все по уму, то в Makefile'е нужно отдельно компилировать fig04_10.cpp в fig04_10.o, GradeBook.cpp в GradeBook.o, а потом линковать fig04_10.o и GradeBook.o в исполняемый файл.
Покажите ваш Makefile

PM MAIL   Вверх
n199a
Дата 4.2.2014, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.11.2011

Репутация: нет
Всего: нет



Цитата(xvr @  4.2.2014,  08:41 Найти цитируемый пост)
Именно. Если делать все по уму, то в Makefile'е нужно отдельно компилировать fig04_10.cpp в fig04_10.o, GradeBook.cpp в GradeBook.o, а потом линковать fig04_10.o и GradeBook.o в исполняемый файл.

Получается, всякий раз, когда я решу сделать проект, надо будет редактировать makefile ?
Цитата(xvr @  4.2.2014,  08:41 Найти цитируемый пост)

Покажите ваш Makefile

Первый раз сталкиваюсь с ним и не знаю что и куда... 
В папке с Geany есть такой filetypes.makefile, но судя по содержанию это не он?
Код

# For complete documentation of this file, please see Geany's main documentation
[styling]
# Edit these in the colorscheme .conf file instead
default=default
comment=comment
preprocessor=preprocessor
identifier=identifier_4
operator=operator
target=label
ideol=type

[settings]
# default extension used when saving files
extension=mak

# the following characters are these which a "word" can contains, see documentation
#wordchars=_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789

# single comments, like # in this file
comment_single=#
# multiline comments
#comment_open=
#comment_close=

# set to false if a comment character/string should start at column 0 of a line, true uses any
# indentation of the line, e.g. setting to true causes the following on pressing CTRL+d
    #command_example();
# setting to false would generate this
#    command_example();
# This setting works only for single line comments
comment_use_indent=true

# context action command (please see Geany's main documentation for details)
context_action_cmd=

[indentation]
#width=4
# 0 is spaces, 1 is tabs, 2 is tab & spaces
type=1


PM MAIL   Вверх
bsa
Дата 4.2.2014, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



n199a, это не то. Какая у тебя среда разработки и почему ее выбрал? как ты запускаешь компиляцию?
PM   Вверх
n199a
Дата 5.2.2014, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.11.2011

Репутация: нет
Всего: нет



Цитата(bsa @  4.2.2014,  19:08 Найти цитируемый пост)
n199a, это не то. Какая у тебя среда разработки и почему ее выбрал? как ты запускаешь компиляцию? 

Geany 1.23 с MinGW 20120426.
Запускаю компиляцию нажатием кнопки "Скомпилировать"  (g++ -Wall -c "%f"). Оно то компилируется, но не собирается.
PM MAIL   Вверх
bsa
Дата 5.2.2014, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



n199a, ты не объяснил причину выбора этой IDE. Судя по всему, тебе она не подходит.
Попробуй Qt Creator (надо установить пакет Qt для Windows) или Code::Blocks.
PM   Вверх
n199a
Дата 9.2.2014, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.11.2011

Репутация: нет
Всего: нет



Цитата(bsa @  5.2.2014,  13:33 Найти цитируемый пост)
n199a, ты не объяснил причину выбора этой IDE. Судя по всему, тебе она не подходит.
Попробуй Qt Creator (надо установить пакет Qt для Windows) или Code::Blocks. 

Выбор обусловился в простоте, не надо много кнопок тыкать...
Code::Blocks не подхоит (не нравится). Qt как-то устанавливал, но не смог, не компилировались сорцы...
PM MAIL   Вверх
bsa
Дата 10.2.2014, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(n199a @  10.2.2014,  00:02 Найти цитируемый пост)
Qt как-то устанавливал, но не смог, не компилировались сорцы...
Понятно.
Если он у тебя стоит еще сделай следующее:
1. запусти
2. Файл - Новый файл или проект - Проект без использования Qt - Простой проект на C++, затем только далее.
3. Скопируй свои исходники в каталог нового проекта
4. Добавь исходники и хидеры к проекту (правой кнопкой по названию проекта или прописать в <название проекта>.pro)
5. Скомпилировать
6. Запустить

PM   Вверх
xvr
Дата 10.2.2014, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(n199a @  9.2.2014,  23:02 Найти цитируемый пост)
Выбор обусловился в простоте, не надо много кнопок тыкать...

Тогда Notepad. Вообще никаких кнопок. а то, что он компилировать  не умеет - не беда, Geany у тебя тоже не компилирует  smile 

PS. В любой IDE сначала надо разобраться как создавать в ней проект, иначе собрать exe'ник не получится. Текст ввести - запросто (и без проекта), а вот что то с ним сделать дальше - очень и очень проблематично.

PM MAIL   Вверх
ZeUsM
Дата 11.2.2014, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 11.10.2011
Где: Moscow

Репутация: нет
Всего: нет



Возьмите CodeLite, есть и под windows и под Linux/Unix. 
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1584 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.