gpt4 book ai didi

c++ - 错误 LNK2005 : already defined - C++

转载 作者:IT老高 更新时间:2023-10-28 22:34:43 28 4
gpt4 key购买 nike

背景

我有一个名为 PersonLibrary 的项目,它有两个文件。

  1. Person.h
  2. Person.cpp

这个库产生一个静态库文件。另一个项目是 TestProject,它使用 PersonLibrary(通过 VS008 中的项目依赖项添加)。一切正常,直到我向 Person.h 添加了一个非成员函数。 Person.h 看起来像

class Person
{
public:
void SetName(const std::string name);

private:
std::string personName_;
};

void SetPersonName(Person& person,const std::string name)
{
person.SetName(name);
}

Person.cpp 定义了 SetName 函数。当我尝试使用 TestProject 中的 SetPersonName 时,我得到 error LNK2005: already defined。这是我的使用方法

#include "../PersonLibrary/Person.h"
int main(int argc, char* argv[])
{
Person person;
SetPersonName(person, "Bill");
return 0;
}

尝试过的解决方法

1 - 我删除了 Person.cpp 并在 Person.h 中定义了整个类。错误消失了,一切正常。

2 - 将 SetPersonName 修饰符更改为 static。像下面这样

static void SetPersonName(Person& person,const std::string name)
{
person.SetName(name);
}

问题

  1. 为什么首先显示的代码没有按预期工作?
  2. 静态在这里有什么不同?
  3. 这个问题的适当解决方案是什么?

谢谢

最佳答案

你要么必须

  • SetPersonName 的定义移动到 .cpp 文件,编译并链接到生成的目标
  • 使 SetPersonName 内联

这是一个众所周知的违反单一定义规则的案例。

static 关键字使函数的链接成为内部链接,即仅对包含它的翻译单元可用。然而,这隐藏了真正的问题。我建议将函数的定义移到它自己的实现文件中,但将声明保留在标题中。

关于c++ - 错误 LNK2005 : already defined - C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/622229/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com