在CodeBlocks中编译c++代码时出现多个定义错误

Multiple definition error when compiling C++ code in CodeBlocks

本文关键字:定义 错误 CodeBlocks 编译 c++ 代码      更新时间:2023-10-16

我被一个可能非常微不足道的问题困了几个小时。

这是类最基本的用法。

头文件: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文件,则只会编译该文件,并且您不会得到相同的错误。