在CodeBlocks中编译c++代码时出现多个定义错误
Multiple definition error when compiling C++ code in CodeBlocks
我被一个可能非常微不足道的问题困了几个小时。
这是类最基本的用法。
头文件:person.h
class person
{
protected:
std::string _Name;
public:
void setName(std::string);
};
实现:person.cpp
#include <string>
#include "person.h"
void person::setName(std::string name)
{
_Name = name;
}
司机:main.cpp
#include <iostream>
#include "person.cpp"
int main()
{
std::cout << "Yes, it worked.n";
return 0;
}
当尝试在CodeBlocks中编译这段代码时(使用GNU GCC),我得到一个错误:
~person.cpp|5|multiple definition of `person::setName(std::string)'|
~person.cpp|5|first defined here|
||=== Build finished: 2 errors, 0 warnings (0 minutes, 0 seconds) ===|
我有一个原型在头文件和主体在实现文件。多重定义在哪里?如果我在person.cpp中添加"inline"之前的"void",它就会起作用,但在这种情况下我为什么要这样做呢?
此外,当在cmd中编译与"g++ main.cpp -o main.exe"相同的代码时,它可以完美地工作(没有内联)!
您不需要在main.cpp中包含*.cpp
文件。您需要包含*.h
文件。
总之- *.cpp
文件包含了编译器的实现和编译。*.h
文件包含定义,可以从*.cpp
文件中包含。当您包含*.cpp
文件时,您将获得同一对象的多个定义。
还需要添加include保护
#ifndef MY_HEADER
#define MY_HEADER
... code of your header file ...
#endif
或者直接添加
#pragma once
今天发生了这种事。
当使用file - new等在代码块中添加文件时,会有一个屏幕询问你是否想要在调试和发布版本中包含该文件。你通过打勾来天真地回答"是"。结果是文件被自动包含,当你自己显式地包含它时,你最终会复制。所以,不要打勾。
干杯矮胖的人
您可以将.cpp文件包含在代码块中的另一个.cpp文件中。但是不要把它添加到你已经创建的项目中。如果文件包含在项目中,代码块将尝试像这样编译它:
g++ main.cpp - 0 main.o
g++ person.cpp -o person.o
,然后使用两个.o文件创建最终的输出文件。因为main.cpp包含了function .cpp,你会遇到多重声明错误。
现在,如果您在项目中只保留main.cpp文件,则只会编译该文件,并且您不会得到相同的错误。
- 使用命名空间时出现多个定义错误
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 尝试调用 .h 文件中定义的变量时出现变量未定义错误
- 在头文件和 cpp 文件中使用一次 #pragma 时出现结构重定义错误
- 链接阶段出现多重定义错误
- 避免模板类中的重定义错误
- 即使我没有包含多个文件,C++中的多个定义错误
- 跨多个类的全局变量而不会出现重定义错误?
- 尝试运行 wasm 函数时出现模块未定义错误
- C++ 预期的左大括号以及重定义错误
- C++:成员的越界声明必须是纯虚函数的定义错误
- c++中数组的未定义错误
- Visual C:模板类中的自定义错误消息
- 为什么C++模板不会导致多个定义错误?
- 只有一个定义/声明时标头声明变量的多堆定义错误
- C++ 在多个其他类中使用单个类 - 编译时出现多个定义错误
- 基类未定义.错误 C2504
- Q 斯坦达项重定义错误
- 可视化C++中的结构定义错误
- VC++ C2011 重定义错误 - 未使用的头文件