Antecedenteserror LNK2005: ya definido - C++
Tengo un proyecto llamado PersonLibrary que tiene dos archivos.
- Person.h
- Person.cpp
Esta biblioteca produce un archivo de biblioteca estática. Otro proyecto es TestProject que utiliza PersonLibrary (Agregado a través de dependencias de proyecto en VS008). Todo funcionó bien hasta que agregué una función no miembro a Person.h. Person.h parece
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 define SetName función. Cuando intento utilizar SetPersonName desde TestProject, obtengo el error LNK2005: ya se ha definido. Aquí es como lo he usado
#include "../PersonLibrary/Person.h"
int main(int argc, char* argv[])
{
Person person;
SetPersonName(person, "Bill");
return 0;
}
Soluciones provisionales trató
1 - He quitado la Person.cpp y define toda la clase en Person.h. El error desapareció y todo funcionó.
2 - Cambiado el SetPersonName modificador a estática. Al igual que el siguiente
static void SetPersonName(Person& person,const std::string name)
{
person.SetName(name);
}
Preguntas
- Por qué el código mostrado por primera vez que no funciona como esperaba?
- ¿Qué diferencia hay estática hecha aquí?
- ¿Cuál es la solución adecuada para este problema?
Gracias
Gracias por la respuesta. Lo ordené –
@dirkgently ... pero boost es solo encabezado IIRC, quizás otras librerías también. ¿Cómo evitan estos problemas? –
Algo que puede ahorrarle tiempo a otros: en caso de que compile el programa C en VS, debe usar __inline para hacerlo en línea (de lo contrario fallará en la compilación) – Illidan