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

时间:2013-01-10 05:35:05

标签: c++ compiler-errors 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中在'void'之前添加'inline',它会起作用,但在这种情况下我为什么要这样做?

此外,在cmd中将这个完全相同的代码编译为“g ++ main.cpp -o main.exe”时,它可以完美地工作(没有内联)!

3 个答案:

答案 0 :(得分:4)

您不需要在main.cpp中包含*.cpp文件。您需要包含*.h文件。

简而言之 - *.cpp文件包含实现并由编译器编译。 *.h个文件包含定义,可以包含在*.cpp个文件中。当您包含*.cpp文件时,您将获得同一对象的多个定义。

此外,您还需要添加include guard

#ifndef MY_HEADER
#define MY_HEADER
... code of your header file ...
#endif

或只是添加

#pragma once

如果您的编译器支持它。

答案 1 :(得分:2)

今天发生了这件事。

使用file-new等在codeblocks中添加文件时,会出现一个屏幕,询问您是否要将该文件包含在调试版和发行版中。你通过勾选方框无辜地回答是。结果是文件自动包含在内,当您自己明确包含该文件时,最终会重复复制。所以,别勾选那些方框。

欢呼声 波奇

答案 2 :(得分:0)

您可以在代码块中的另一个.cpp中包含.cpp文件。但是不要将它添加到您创建的项目中。如果文件包含在项目中,代码块将尝试编译它:

g ++ main.cpp -o main.o

g ++ person.cpp -o person.o

然后使用两个.o文件创建最终输出文件。由于main.cpp包含func.cpp,因此您将遇到多重声明错误。

现在,如果你只保留项目中的main.cpp文件,那么只会编译它,你不会得到同样的错误。