Background
I have a project named PersonLibrary which has two files.
- Person.h
- Person.cpp
This library produces a static library file. Another project is TestProject which uses the PersonLibrary (Added though project dependencies in VS008). Everything worked fine until I added a non-member function to Person.h. Person.h looks like
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 defines SetName function. When I try to use SetPersonName from TestProject, I get error LNK2005: already defined. Here is how I used it
#include '../PersonLibrary/Person.h' int main(int argc, char* argv[]) { Person person; SetPersonName(person, 'Bill'); return 0; }
Workarounds tried
1 – I have removed the Person.cpp and defined the whole class in Person.h. Error gone and everything worked.
2 – Changed the SetPersonName modifier to static. Like the below
static void SetPersonName(Person& person,const std::string name) { person.SetName(name); }
Questions
- Why the code shown first is not working as I expected?
- What difference static made here?
- What is the approapriate solution for this problem?
Thanks
You either have to
SetPersonName‘s definition to a .cpp file, compile and link to the resulting targetSetPersonNameinlineThis is a well known case of One Definition Rule violation.
The static keyword makes the function’s linkage internal i.e. only available to the translation unit it is included in. This however is hiding the real problem. I’d suggest move the definition of the function to its own implementation file but keep the declaration in the header.