我试图解决这个问题一段时间后,我似乎无法找到解决方案。我收到错误: 找到一个或多个乘法定义的符号 我在处理更复杂的事情时遇到了这个错误,但即便是像这样的简单例子也不适合我。这是我的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);
我想这是微不足道的,但如果你认为这是重复的话请不要愤怒,因为我是初学者而我并不了解更复杂的例子。一些帮助将不胜感激。
答案 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 ++始终遵循单一定义规则。但是,只要所有声明都是一致的,您就可以拥有尽可能多的声明。