找到一个或多个乘法定义的符号错误 - 简单

时间:2014-11-08 14:00:37

标签: c++

我试图解决这个问题一段时间后,我似乎无法找到解决方案。我收到错误:     找到一个或多个乘法定义的符号 我在处理更复杂的事情时遇到了这个错误,但即便是像这样的简单例子也不适合我。这是我的main.cpp:

#include "defs.cpp"

int main()
{
string a = "A";
printIt(a);
}

,这是我的defs.cpp:

#include "header.h"

void printIt(string a)
{
cout << a;
}

,这是我的header.h:

#include <string>
#include <iostream>
using namespace std;

void printIt(string a);

我想这是微不足道的,但如果你认为这是重复的话请不要愤怒,因为我是初学者而我并不了解更复杂的例子。一些帮助将不胜感激。

4 个答案:

答案 0 :(得分:0)

您不应该#include CPP文件。仅包含包含函数原型定义的头文件。如果不存在这样的头文件,请将函数原型放在程序中(例如,在写入main的文件中)。

在您的情况下,您将(直接/间接)包含具有该功能的定义的CPP文件。由于相同的定义是通过CPP文件编译的,因此编译器会将它们放入.OBJ文件(称为中间对象文件)。链接器最终尝试组合这些Object文件,并说某些函数(符号)是多重定义的。

答案 1 :(得分:0)

当您看到#include "defs.cpp"时,您需要非常怀疑:cpp文件并不包含在内;只有头文件才是为此设计的。

不是包含cpp文件,而是为它写一个标题。您的header.h似乎已包含printIt的前向声明:

void printIt(string a);

现在用#include defs.cpp替换#include "header.h",然后编译代码。这应该可以解决问题。

编译这取决于您尝试的系统。在类UNIX系统上,您可以编写

g++ defs.cpp main.cpp
./a.out

答案 2 :(得分:0)

main.cpp中,您包括defs.cpp,其中包含printIt的定义。因此,与main.cpp对应的翻译单元定义了printIt

但是,您还在编译定义defs.cpp的{​​{1}}。因此,printIt对应的翻译单元也定义了defs.cpp

将两者合并为一个程序将导致ODR禁止此功能的多个(但等效的)定义。删除printIt指令,您的程序应该正确链接。

答案 3 :(得分:0)

这是因为你包括: -

#include "defs.cpp"

由于这个原因,printIt方法有多种定义。

这些是一些基本规则: -

1)您必须始终只在源文件中包含头文件。即使这样你也必须确保头文件只被包含一次,因为如果它被包含多次,那么可能再次成为多重定义的问题。为了防止你的头文件应该包含头部gaurds。

2)C ++始终遵循单一定义规则。但是,只要所有声明都是一致的,您就可以拥有尽可能多的声明。