即使包含头文件,程序也会出现LNK2019错误

时间:2011-03-26 19:54:07

标签: c++ visual-c++

我试图了解如何在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;
}

测试2.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 个答案:

答案 0 :(得分:2)

包含文件只满足编译器。您需要链接所有obj文件 如果您使用的是visual studio,请确保所有这些文件都包含在您正在构建的项目中。

一个旁注,在头文件上使用int val = 10是错误的 - 你会遇到链接问题。 将其放在cpp文件中,并在其标题上使用extern int val

HTH

答案 1 :(得分:2)

您必须告诉编译器编译所有cpp文件。编译器使用cpp文件构建目标文件,例如test1.obj,test2.obj和test.obj。然后,它将这些对象链接在一起成为库或可执行文件。

你得到的是一个链接器错误,好吧,test.obj使用func1和func2,我在test1.h和test2.h中声明了这些func,但它们在哪里实现?我没有test1.obj也没有test2.obj,编译器似乎没有构建它们。

答案 2 :(得分:1)

包含头文件很少能解决链接错误。通常,标题为您提供函数声明。然后,您需要链接提供函数定义的库。

在这种情况下,您说您的项目中只有test.cpp。这意味着test1.cpptest2.cpp既未编译也未链接,因此函数定义不存在。

test1.cpptest2.cpp添加到您的VS项目中。