2011-10-10 109 views
4

所以我有这个奇怪的问题:当我导入一个单独的类的.h文件时,我非常基本的程序会生成一个错误消息(未定义引用'foo :: foo(int)')。但是,当我将导入文件更改为.cpp时,它一切正常。#include .h或.cpp文件?

现在,我已经读了一些,看过一些视频教程,他们都这样说:导入.h文件。那为什么它不工作?

我使用Code :: Blocks,在Windows 7中编译和运行(无命令行)。我确实怀疑某些东西设置不正确,但是我确实想知道它是否可以是我的代码失败了。

Main.cpp的:

#include <iostream> 
#include "Foo.h" //This don't work. If i include Foo.cpp it does. 

using namespace std; 

int main() 
{ 
    Foo k(10); 
    cout << k.getInt() << endl; 
} 

了foo.h:

#ifndef FOO_H 
#define FOO_H 

class Foo 
{ 
    public: 
     Foo(int tall); 
     int getInt()const; 
    protected: 
    private: 
     int m; 
}; 

#endif 

Foo.cpp中:

#include "Foo.h" 

Foo::Foo(int tall) 
: m(tall) 
{ 
    //ctor 
} 

int Foo::getInt()const 
{ 
    return m; 
} 
+7

可能是最好的拿起了一本书,并开始逐渐熟悉的基础知识! 1)你的程序不会产生错误,你的编译器会这样做。 2)它不是编译错误,而是链接错误。 3)你不“导入”头文件,你*包括*它。 4)了解翻译单元,模块化编译和链接。 –

+2

好吧,我意识到我写这篇文章有点太快了。我确实知道这是编译器产生的错误,我可以猜到第二点(对连接还不太熟悉),第三点只是一个错误类型 - 我的第一语言是Java。不过,第四点似乎确实是个好主意。 谢谢。 – MartinHaTh

+0

@MartinHaTh:关键的区别在于Java的'import'真的*导入*模块并为您找到所有相关文件,而在C++中,您所做的只是* include *文件的内容,头文件*文件 - 你仍然需要自己执行链接。所以术语的区别不仅仅在于恰当。 –

回答

1

您需要编译main.cppfoo.cpp并将两个生成的目标文件链接在一起。

+1

我猜Code :: Blocks应该自动执行 –

+1

@AlessandroPezzato我只是在Code :: Blocks上搜索,似乎IDE应该照顾所有这些。也许OP创建了一个空项目,这样向导就不会创建任何设置。 – Praetorian

+0

嗯,我想这可能是我的错。我创建了一个空白文件(只是为了不获取.h文件),并将其命名为Main.cpp。然后,在编写该类之后,我创建了一个新类,它创建了cpp和头文件。这可能是问题所在。 好的,我可以证实这是问题所在。现在一切正常。男人,我很傻... – MartinHaTh

1

你无法编译和/或链接Foo.cpp中文件,当你做你的链接步骤。我不熟悉Code :: Blocks,所以我不能告诉你如何解决它。

0

右键单击您的.cpp文件并转到属性。在构建选项卡上,确保编译,链接,调试和发布被选中。

enter image description here

+0

这是什么操作系统?它看起来像Debian – Arc676

+0

@ Arc676我认为这是Arch with xfce。 – Pubby

+0

Arch是否有控制台界面?Raspberry Pi OS“Raspbian”(Debian版本)启动到控制台并需要终端命令来激活GUI。我下载了Debian,但它唯一的控制台界面是恢复控制台。 Arch是否有类似的界面? – Arc676