2011-03-26 87 views
3

我想了解如何在C++中包含多個文件。我做了很多搜索,最後我寫了一個測試代碼,總結了我的問題。我有兩個頭文件和兩個cpp文件看起來像這樣:即使在包含頭文件之後,程序仍會給出LNK2019錯誤

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)" ([email protected]@YAXXZ) referenced in function _main ** 
**1>test.obj : error LNK2019: unresolved external symbol "void __cdecl func1(void)" ([email protected]@YAXXZ) referenced in function _main ** 

我不太瞭解,甚至包括兩個頭文件,爲什麼我會收到此之後?我錯過了什麼?

任何幫助,將不勝感激!

感謝 新手

回答

2

包括文件只滿足編譯器。您需要將鏈接所有的obj文件放在一起。
如果您使用visual studio,請確保所有這些文件都包含在您正在構建的項目中。

一個側面說明,在頭文件上使用int val = 10是錯誤的 - 您將遇到鏈接問題。 將它放在一個cpp文件中,並在其標題上使用extern int val

HTH

+0

謝謝Hertzel ...包括test1.cpp和test2.cpp解決了這個問題。現在有點顯而易見了,但我之前認爲只包括頭文件應該考慮到這一點。 – Richeek 2011-03-26 20:08:10

+0

你是對的「val」。但是,如果我這樣做:static const int val = 10;如果我想聲明一個全局const變量。有用。那這是一個好習慣嗎? – Richeek 2011-03-26 20:08:43

+0

@Newbie:比較好。 – 2011-03-26 20:26:49

2

您將不得不告訴編譯器編譯所有的cpp文件。編譯器使用cpp文件構建目標文件,例如test1.obj,test2.obj和test.obj。然後,它將這些對象鏈接到一個庫或一個可執行文件中。

你得到的是一個鏈接器錯誤,說,好的,test.obj使用func1和func2,我在test1.h和test2.h中聲明瞭這些funcs,但是它們在哪裏實現?我沒有test1.obj和test2.obj,編譯器似乎沒有構建它們。

+0

是的你是對的。謝謝您的幫助!!!我很感激。 – Richeek 2011-03-26 20:12:45

1

包含頭文件很少解決鏈接錯誤。通常,標題給你函數聲明。然後你需要鏈接給你函數定義的庫。

在這種情況下,你說你的項目中只有test.cpp。這意味着test1.cpptest2.cpp既不編譯也不鏈接,因此函數定義不存在。

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

+0

是的......我現在已經這樣做了。謝謝您的幫助! – Richeek 2011-03-26 20:18:40

相關問題