0

我的问题与类似,但我不知道如何在 Eclipse 中修复它。

在 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。

有什么建议么?

谢谢!

4

2 回答 2

1

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

请改用“#pragma once”。

// .h file
#pragma once

namespace lol
{
    class foo {};
}

// end of file

在此处查看我对编译单元和管道的解释。

于 2013-10-08T19:12:46.047 回答
0

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

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

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

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

于 2013-10-08T19:26:28.017 回答