Программа выдает ошибку LNK2019 даже после включения заголовочных файлов - PullRequest
3 голосов
/ 26 марта 2011

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

test1.h:

#ifndef _TEST_1_H
#define _TEST_1_H

int val = 10;
void func1();

#endif

test2.h:

#ifndef _TEST_2_H
#define _TEST_2_H

#include "test1.h"
void func2();

#endif

test1.cpp:

#include <iostream>
#include "test1.h"

void func1()
{
    std::cout<<val<<std::endl;
}

test2.cpp:

#include <iostream>
#include "test2.h"

void func2()
{
    func1();
}

И мой основной файл выглядит следующим образом:

test.cpp:

#include <iostream>
#include "test2.h"
#include "test1.h"


int main()
{
    func1();
    func2();
    getchar();
    return 0;
}

Я использую VS10, и я только добавил "test.cpp" в качестве исходного файла. Когда я компилирую этот код, я получаю следующую ошибку:

**1>test.obj : error LNK2019: unresolved external symbol "void __cdecl func2(void)" (?func2@@YAXXZ) referenced in function _main **
**1>test.obj : error LNK2019: unresolved external symbol "void __cdecl func1(void)" (?func1@@YAXXZ) referenced in function _main **

Я не совсем понимаю, даже после включения обоих заголовочных файлов, почему я получаю это? Чего мне не хватает?

Буду признателен за любую помощь!

Спасибо Новичок

Ответы [ 3 ]

2 голосов
/ 26 марта 2011

Вы должны будете указать компилятору компилировать все файлы cpp.Компилятор создает объектные файлы с помощью файлов cpp, таких как test1.obj, test2.obj и test.obj.Затем он связывает эти объекты вместе в библиотеку или исполняемый файл.

То, что вы получаете, - это ошибка компоновщика, говорящая, хорошо, test.obj использует func1 и func2, и у меня есть объявление этих функций в test1.h и test2.h, но где они реализованы?У меня нет ни test1.obj, ни test2.obj, похоже, компилятор их не создал.

2 голосов
/ 26 марта 2011

Включая файлы удовлетворяют только компилятор.Вам нужно связать все файлы obj вместе.
Если вы используете visual studio, убедитесь, что все эти файлы включены в проект, который вы создаете.

Одно примечание, использование int val = 10 в заголовочном файле неверно - у вас возникнут проблемы с связью.Поместите его в файл cpp и используйте extern int val в заголовке.

HTH

1 голос
/ 26 марта 2011

Включение заголовочных файлов редко решает ошибки ссылок.Обычно заголовки дают вам объявления функций.Затем вам нужно связать библиотеки, которые дают вам определения функций.

В этом случае вы говорите, что в вашем проекте есть только test.cpp.Это означает, что test1.cpp и test2.cpp не скомпилированы и не связаны, и, следовательно, определения функций не существуют.

Добавьте test1.cpp и test2.cpp в ваш проект VS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...