GCC无法从.h类自动解析.cpp

时间:2013-10-08 19:03:31

标签: c++ eclipse gcc eclipse-cdt

我的问题类似于this one,但我无法想象如何在日食中修复它。

在eclipse上编译一个小程序时,我有一种奇怪的行为。当我在标题的末尾包含.cpp文件(并删除.cpp中的.h的包含)时,它会编译,否则不会。

我想要包含的课程是在一个单独的项目中,该项目是正确链接的。

以下是一个例子:

在项目来源

文件myclass.h

#ifndef MYCLASS_H_
#define MYCLASS_H_

namespace lol
{
class myclass{ public // definitions... }
}
//#include myclass.cpp //**works when I uncomment this**
#endif

文件myclass.cpp

#include "myclass.h" // ** does not work unless I include my .cpp (unity build like) **
                     // and I don't want to include .cpp files
namespace lol{ // not funny

myclass::myclass(){
} //code ... code
}

在其他项目中 mainFile.cpp

#include "myclass.h" // works only if I include myclass.cpp at the end of myclass.h

using namespace lol;
int main(){
    myclass obj = myclass(); // gives undefined reference to lol::myclass::myclass()
}

我可以通过构建makefile来解决这个问题,这是我喜欢的解决方案,但遗憾的是我需要使用eclipse。

有什么建议吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

您在包含文件的末尾缺少“#endif”。

改为使用“#pragma once”。

// .h file
#pragma once

namespace lol
{
    class foo {};
}

// end of file

请参阅我对编译单元和管道here的解释。

答案 1 :(得分:0)

我想说如果从eclipse自动生成文件生成中看到你的.cpp它将它作为源(翻译单元)并将其添加到源列表中。

如果要包含内联定义(一次),则应使用不同的文件扩展名(例如.tcc.icc)。

您还可以尝试将其从项目的资源配置中排除(右键单击.cpp,选择“资源配置 - >从构建中排除”。)

另一种选择是将项目类型更改为“Makefile项目”并自行维护makefile。