Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Не собирается после отделения интерфейса класса


Автор: n199a 2.2.2014, 00:02
Почему проект не собирается после отделения интерфейса класса?

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


(.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;
}



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

Автор: n199a 2.2.2014, 13:33
Цитата(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"


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

Автор: bsa 2.2.2014, 16:13
n199a, а еще надо было ставить http://forum.vingrad.ru/faq/topic-190805.html.

Автор: n199a 3.2.2014, 20:43
Цитата(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

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

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

Автор: n199a 3.2.2014, 21:58
Цитата(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
Сборка завершилась с ошибкой.


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

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

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

У меня включает же. Почему этот Geany не собирает?
Может в make дописать что-то надо?

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

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

Автор: n199a 4.2.2014, 14:08
Цитата(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


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

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

Geany 1.23 с MinGW 20120426.
Запускаю компиляцию нажатием кнопки "Скомпилировать"  (g++ -Wall -c "%f"). Оно то компилируется, но не собирается.

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

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

Выбор обусловился в простоте, не надо много кнопок тыкать...
Code::Blocks не подхоит (не нравится). Qt как-то устанавливал, но не смог, не компилировались сорцы...

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

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

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

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

Автор: ZeUsM 11.2.2014, 11:45
Возьмите CodeLite, есть и под windows и под Linux/Unix. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)