Ошибка компоновщика C ++ при попытке компилировать второй модуль с использованием Code :: Blocks - PullRequest
2 голосов
/ 08 июня 2010

Итак, я пытаюсь выучить C ++ и дошел до использования заголовочных файлов. Они действительно не имеют смысла для меня. Я пробовал много комбинаций этого, но пока ничего не получалось:

main.cpp:

#include "test.h"

int main() {
    testClass Player1;
    return 0;
}

test.h:

#ifndef TEST_H_INCLUDED
#define TEST_H_INCLUDED
class testClass {
    private:
        int health;
    public:
        testClass();
        ~testClass();
        int getHealth();
        void setHealth(int inH);
};
#endif // TEST_H_INCLUDED

test.cpp:

#include "test.h"

testClass::testClass() { health = 100; }
testClass::~testClass() {}

int testClass::getHealth() { return(health); }
void testClass::setHealth(int inH) { health = inH; }

То, что я пытаюсь сделать, довольно просто, но то, как работают файлы заголовков, просто не имеет для меня никакого смысла. Блоки кода возвращают следующее при сборке:

obj \ Debug \ main.o (.text + 0x131) || В функции main':| *voip*\test\main.cpp |6|undefined reference to testClass :: testClass () '| obj \ Debug \ main.o (.text + 0x13c): voip \ test \ main.cpp | 7 | неопределенная ссылка на `testClass :: ~ testClass () '| || === Сборка завершена: 2 ошибки, 0 предупреждений === |

Буду признателен за любую помощь. Или, если у вас есть достойный учебник для него, это тоже будет хорошо (большинство уроков, которые я гуглил, не помогло)

Ответы [ 5 ]

3 голосов
/ 09 июня 2010

Code :: Blocks не знает, что он должен скомпилировать test.cpp и создать объектный файл test.o (чтобы последний мог быть связан вместе с main.o для создания исполняемого файла).Вы должны добавить test.cpp к своему проекту.

В Code :: Blocks перейдите к Project>Add File в меню и выберите файл test.cpp.Убедитесь, что установлены оба флажка Release и Debug.

Затем Build->Rebuild.

EDIT:

Вот совет, который поможет вам понять, чтоIDE делает под капотом при компиляции.Перейдите на Settings -> Compiler and Debugger -> Global Compiler Settings -> Other settings и выберите Full command line в выпадающем списке Compiler logging.Теперь при сборке команды компилятора gcc будут регистрироваться в журнале сборки.Всякий раз, когда кто-то в StackOverflow запрашивает используемую вами командную строку gcc, вы можете скопировать и вставить то, что находится в журнале сборки.

3 голосов
/ 08 июня 2010

Нет ничего плохого в том, как вы настроили заголовок.Ваша ошибка происходит во время ссылки.Какая у тебя командная строка gcc?Я предполагаю, что вы компилируете только main.cpp и забыли test.cpp.

0 голосов
/ 09 июня 2010

Некоторая (краткая) информация и о заголовочных файлах - строка #include в ваших .cpp файлах просто указывает компилятору вставить содержимое этого файла в поток, подлежащий компиляции в этой точке. Поэтому они позволяют вам объявлять testClass в одном месте (test.h) и использовать его во многих местах. (main.cpp, someother.cpp, blah.cpp). Ваш test.cpp содержит определения методов testClass, поэтому вам необходимо также связать его с конечным исполняемым файлом.

Но в заголовочных файлах нет ничего волшебного, это просто простая подстановка текста, используемая для удобства, чтобы вам не приходилось объявлять один и тот же класс или функции снова и снова. У вас (правильно) есть этот #ifndef TEST_H_INCLUDED материал, так что в случае, если у вас есть someother.h, который #include test.h и main.cpp #include, как test.h, так и someother.h, вы получите единственная копия объявления testClass.

Надеюсь, это поможет!

0 голосов
/ 08 июня 2010

как сказано в других ответах, это ошибка ссылки.компилировать и ссылаться так:

g++ Main.cpp test.cpp -o myprogram -Wall -Werror
0 голосов
/ 08 июня 2010

Какие команды вы используете для сборки? Похоже, что вы не компилируете и не связываете в test.cpp, поэтому, когда main.cpp отправляется на поиск соответствующих символов, он не может их найти (сбой связи).

...