我试图了解如何在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 **
即使在包含两个头文件之后我也不太明白为什么我得到这个?我错过了什么?
任何帮助将不胜感激!
由于 新手
答案 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.cpp
和test2.cpp
既未编译也未链接,因此函数定义不存在。
将test1.cpp
和test2.cpp
添加到您的VS项目中。