尝试使用Code :: Blocks编译第二个模块时出现C ++链接器错误

时间:2010-06-08 19:51:43

标签: c++ header linker codeblocks

所以我正在尝试学习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 \ Debug \ main.o(。text + 0x131)||函数main':| *voip*\test\main.cpp |6|undefined reference to testClass :: testClass()'|   obj \ Debug \ main.o(。text + 0x13c): voip \ test \ main.cpp | 7 |对`testClass :: ~testClass()'的未定义引用   || ===构建完成:2个错误,0个警告=== |

我很感激任何帮助。或者,如果你有一个体面的教程,那也没关系(我用Google搜索的大多数教程没有帮助)

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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,然后在Full command line下拉框中选择Compiler logging。现在,无论何时构建,gcc编译器命令都将记录在构建日志中。每当StackOverflow上有人询问您使用的gcc命令行时,您都可以复制并粘贴构建日志中的内容。

答案 2 :(得分:0)

您使用什么命令构建?您似乎没有在test.cpp中进行编译和链接,因此当main.cpp去寻找合适的符号时,它找不到它们(链接失败)。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

关于头文件的一些(简要)信息 - .cpp文件中的#include行只是指示编译器将该文件的内容粘贴到此时要编译的流中。因此,他们允许您在一个地方(test.h)声明testClass并在许多地方使用它。 (main.cpp,someother.cpp,blah.cpp)。你的test.cpp包含了testClass方法的定义,所以你需要将它链接到最终的可执行文件中。

但是头文件并没有什么神奇之处,只是简单的文本替换是为了方便,所以你不必一遍又一遍地声明相同的类或函数。你已经(正确地)得到了#ifndef TEST_H_INCLUDED的内容,这样你就有了其他的#includes test.h和main.cpp#包括test.h和someother.h,你只会得到它们testClass声明的单个副本。

希望这有帮助!