当前位置:  开发笔记 > 编程语言 > 正文

错误LNK2005:已定义 - C++

如何解决《错误LNK2005:已定义-C++》经验,为你挑选了1个好方法。

背景

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

    Person.h

    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时,我收到错误LNK2005:已定义.这是我如何使用它

#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> dirkgently..:

你要么必须

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

制作SetPersonName内联

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

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

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有