4

这是一个非常基本的问题,目前让我感到沮丧。假设在一个解决方案中,我有两个项目。我们将第一个项目称为 SimpleMath。它有一个头文件“Add.h”,其中

int add(int i, int j)

以及具有的实现“Add.cpp”

int add(int i, int j) {
  return i+j;
}

现在假设在第二个项目中我想使用 add 函数。但是,这段代码:

#include "..\SimpleMath\Add.h"

int main() {

    add(1, 2);

}

导致“未解析的外部符号”。如何让第二个程序“了解” .cpp 文件中的实际实现。作为旁注,所有代码都是虚构的,这不是我实际编程的方式。

4

6 回答 6

6

如果您尝试将 C 库链接到 C++ 项目,则需要执行类似的操作

extern "C" {
    #include "..\SimpleMath\Add.h"
}

因为 C 和 C++ 使用不同的符号名称。

于 2009-07-30T14:34:28.707 回答
6

你得到错误的原因是通过包含头文件你告诉编译器有一个符号

int add (int, int)

这将在链接期间出现,但您实际上并未在项目中包含该符号(函数的代码)。解决此问题的一种快速方法是简单地将 Add.cpp 添加到两个项目中。但“不错”的解决方案可能是通过更改项目属性中的项目类型将 SimpleMath 变成库而不是应用程序。

顺便说一句,您可能需要某种机制来防止多次包含该头文件。如果您坚持使用 Visual C++,我通常使用#pragma oncewhich 应该没问题,但它可能不是完全可移植的,所以如果您想要可移植性,请使用更传统的方法,将头文件包装在#ifndef-block 中,如下所示:

#ifndef __ADD_H
#define __ADD_H

int add (int i, int j);

#endif

祝你好运。

于 2008-10-09T08:42:07.817 回答
3

您要么必须使 Add.cpp 成为库的一部分并将其包含在两个项目中。或者您也必须将 Add.cpp 添加到您的第二个项目中。

编辑:使 SimpleMath 成为一个库,进入 General 上的项目设置,并将 Configuration Type 更改为 Static Lib。

然后进入您的解决方案设置,单击 Project Dependencies,然后在下拉列表中选择您的第二个项目,并在 SimpleMath 旁边打勾。这将自动将 SimpleMath 链接到您的第二个项目,并且还将确保在您重新构建第二个项目时重新构建对 SimpleMath 的任何更改。

于 2008-10-09T08:29:06.800 回答
1

SimpleMath 需要在其项目属性中定义为库文件(.LIB),我假设这是一个非托管(非.Net)C++。然后在另一个项目中包含 SimpleMath.lib。

于 2008-10-09T08:31:12.660 回答
1

刚刚在同一个项目中也有它,结果我有两个过滤器并将两个 .cpp-files 命名为相同的名称。所以 Visual Studio 只是在编译另一个时覆盖了一个 .obj 。导致第一个 .obj 中缺少函数。教训:永远不要将 .cpp 文件命名为相同的名称,即使在不同的文件夹/过滤器中也是如此。

于 2016-11-27T15:04:13.877 回答
0

我只是在同一个项目中遇到了这个问题......仔细查看我的代码后,我注意到尝试调用该函数的代码正在使用接口(通过纯虚拟方法调用 = 0)。但是,我忘记在接口类和实现类中添加“虚拟”二字。一旦我添加了“虚拟”,问题就解决了。

于 2011-12-12T09:42:34.770 回答