2010-06-08 58 views
2

因此,我正在尝试学习C++,并且尽可能使用头文件。他们真的对我毫无意义。我试过很多这样的组合,但没有迄今已工作:尝试编译使用Code :: Blocks的第二个模块时出现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 \调试\ main.o(+的.text 0x131)||在功能main':| *voip*\test\main.cpp |6|undefined reference to的TestClass :: TestClass的()“| ()。testClass()'testClass()'的未定义引用。 || ===构建完成:2个错误,0个警告=== |

我很感激任何帮助。或者如果你有一个体面的教程,这也可以(我已经使用的大多数教程都没有帮助)

回答

3

Code :: Blocks不知道它必须编译test.cpp并生成一个目标文件test.o(以便后者可以与main.o连接在一起生成可执行文件)。您必须将test.cpp添加到您的项目中。

在Code :: Blocks中,在菜单中选择Project>Add File,然后选择您的test.cpp文件。确保选中了Release和Debug复选框。

然后Build->Rebuild

编辑:

这里有一个技巧,帮助你看到什么IDE的引擎盖下编译时做的事情。转到Settings -> Compiler and Debugger -> Global Compiler Settings -> Other settings并在Compiler logging下拉框中选择Full command line。现在,无论何时构建,gcc编译器命令都将记录在生成日志中。每当有人在StackOverflow询问你使用的gcc命令行时,你可以复制和粘贴生成日志中的内容。

+0

谢谢你,解决了它。感谢您的提示。 – Karl 2010-06-08 21:00:09

3

你设置标题的方式没有任何问题。链接期间发生错误。你的gcc命令行是什么?我的猜测是你正在编译main.cpp,并忘记了test.cpp。

+0

我不确定。我只是点击“构建和运行”。我认为这会编译所有文件并自动链接它们。我对Codeblocks还没有非常熟悉,但我认为你们都是对的。我尝试过自己构建它,它返回它没有目标。 – Karl 2010-06-08 20:02:27

0

你用什么命令来构建?看起来你没有编译和链接test.cpp,所以当main.cpp寻找合适的符号时,它找不到它们(链接失败)。

0

如在其他答案中所述,这是一个链接错误。编译和像这样的链接:

g++ Main.cpp test.cpp -o myprogram -Wall -Werror 
+0

OP使用IDE,而不是命令行。 – 2010-06-08 20:22:50

0

约头部分(简介)信息文件了 - 在你的.cpp文件#include行只是指示编译器在该文件的内容粘贴到流至在那个时候编译。所以他们让你在一个地方(test.h)声明testClass并在很多地方使用它。 (main.cpp,someother.cpp,blah.cpp)。你的test.cpp包含了testClass方法的定义,所以你也需要将它链接到最终的可执行文件中。

但是头文件并没有什么魔力,它只是简单的文本替换而已,为了方便您不必一次又一次地声明相同的类或函数。你已经(正确地)在那里找到了#ifndef TEST_H_INCLUDED的东西,这样在你有someother.h的机会中,包括test.h和main.cpp #includes test.h和someother.h,你只会得到testClass声明的单个副本。

希望这会有所帮助!

+0

谢谢你,我很高兴听到我的头标是正确的。可能只是我不知道如何使用IDE。 – Karl 2010-06-08 20:16:09

相关问题