如何在不复制的情况下将C ++类从一个项目重用到另一个项目

时间:2017-01-18 16:35:18

标签: c++ include

我遇到以下问题:

我有一个包含数学类(.h和.cpp文件)的项目。 我想在不同的项目中使用这些类(不是同一个解决方案),但我不能。

在新项目中,我添加了一个包含数学项目包含文件的路径。当我尝试#include他们时,它可以工作,我可以看到我的课程,但在尝试使用它们时,我得到了#34;未解决的外部"。我还没有创建一个.dll或.lib,所以我真的不知道造成这种情况的原因。

如果您有任何建议,我会很感激。

非常感谢你。

1 个答案:

答案 0 :(得分:2)

  

当我尝试#include他们时它起作用,我可以看到我的课程但是   在尝试使用它们时,我得到“未解决的外部”。我没有创造   一个.dll或一个.lib所以我真的不知道是什么造成了这个。

您尚未创建库正是原因为什么会出现错误。新项目中的编译单元(*.cpp文件”)包含类的标题并使用类定义,但缺少成员的定义。

例如,假设您的旧项目中有一个名为"c.h"的文件:

#ifndef C_H
#define C_H

class C
{
public:
    C();
    void f();
};

#endif

新项目中的某些*.cpp文件包含标题并使用类:

#include "somepath/oldproject/c.h"

void someFunction()
{
    C c;
    c.f();
}

编译很好,但会导致链接器错误,因为C::CC::f定义将会丢失。

现在,对此的干净解决方案肯定将旧项目中的somepath/oldproject/c.cpp添加到新项目中,尽管这会修复链接器错误,但是要使用基于库的做法。将您的数学课程变成一个图书馆项目,我们称之为“Math Utils”,它会生成一个*.lib文件(就像您在Windows上一样),例如math-utils.lib。将库的包含和释放路径添加到全局包含和库路径。然后将math-utils.lib文件添加到新项目的链接器依赖项中。

将新项目中的代码更改为:

#include <math-utils/c.h>

void someFunction()
{
    C c;
    c.f();
}

在旧项目中做同样的事情!您将最终完成三个不同的项目。两个应用项目和一个图书馆项目,前两个取决于后者。

第一次创建自己的库可能有点令人生畏,但好处是值得的。

另见The Linker Is not a Magical Program