Visual C ++未解析的外部符号(找不到我自己的一个函数)

时间:2008-10-09 08:27:25

标签: visual-c++ linker-errors

这是一个非常基本的问题,令我感到沮丧。让我们说在一个解决方案中,我有两个项目。让我们调用第一个项目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文件中的实际实现。作为旁注,所有代码都是虚构的,这不是我实际编程的方式。

7 个答案:

答案 0 :(得分:5)

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

int add (int, int)

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

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

#ifndef __ADD_H
#define __ADD_H

int add (int i, int j);

#endif
祝你好运。

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:3)

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

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

看一下这个链接,它可以帮到你:

http://msdn.microsoft.com/en-us/library/0603949d.aspx

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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