Hi, I'm a newbie to C++. I use Windows XP Home Edition and VC++ .NET 2003.

I have just recently started creating large scale C++ projects with more than one file. I've been having troubles linking the files together.

I solved the problem by adding "/FORCE:MULTIPLE" to the command line, but the compiler still gives linker warnings. I don't feel satisfied just by cheating my way out.

The real source files are large, and I know that it is a linker error, so I created smaller files with a similar structure that give the same errors.

Here are the source files:

stdafx.cpp

#include "stdafx.h"

Untitled.cpp

#include "stdafx.h"
#include "MyClass.cpp"
#include "OtherClass.cpp"
 
usingnamespace std;
 
int main()
{
myClass Class;
otherClass Class2;
 
return 0;
}

MyClass.cpp

#include "stdafx.h"
 
usingnamespace std;
 
class myClass
{
public:
 
myClass();
 
int variable;
 
void function1();
void function2();
 
};
 
myClass::myClass()
{
variable = 0;
}
 
void myClass::function1()
{
variable = 1;
}
 
void myClass::function2()
{
variable = 2;
}

OtherClass.cpp

#include "stdafx.h"
 
class otherClass
{
public:
 
otherClass();
 
int variable;
 
void function1();
void function2();
 
};
 
otherClass::otherClass()
{
variable = 0;
}
 
void otherClass::function1()
{
variable = 1;
}
 
void otherClass::function2()
{
variable = 2;
}

And here are the errors:

MyClass.obj : error LNK2005: "public: __thiscall myClass::myClass(void)" (??0myClass@@QAE@XZ) already defined in Untitled.obj
MyClass.obj : error LNK2005: "public: void __thiscall myClass::function1(void)" (?function1@myClass@@QAEXXZ) already defined in Untitled.obj
MyClass.obj : error LNK2005: "public: void __thiscall myClass::function2(void)" (?function2@myClass@@QAEXXZ) already defined in Untitled.obj
OtherClass.obj : error LNK2005: "public: __thiscall otherClass:0therClass(void)" (??0otherClass@@QAE@XZ) already defined in Untitled.obj
OtherClass.obj : error LNK2005: "public: void __thiscall otherClass::function1(void)" (?function1@otherClass@@QAEXXZ) already defined in Untitled.obj
OtherClass.obj : error LNK2005: "public: void __thiscall otherClass::function2(void)" (?function2@otherClass@@QAEXXZ) already defined in Untitled.obj
Debug/Untitled.exe : fatal error LNK1169: one or more multiply defined symbols found

Thanks in advance! :cheesy:

btw: Do error messages need "code" tags?

A big THANK YOU for using code tags! You are one of the few newbies that actually read the rules and follow them from the first post.

2 things that caught my eye right away:

Never include cpp files. Since they are implementation files, all that should be required is that you add them to your project's workspace.

Secondly, you need to place you class definitions in header files (.h). These header files are then included by your .cpp files that use the functions, or in the case of the class method implementation cpp files, define the functions.

In case that wasn't clear, here's what I mean:

// myclass.h
#ifndef MYCLASS_H   // note: these are very important!
#define MYCLASS_H
class myClass {

public:
    void myFunc();
    // blah blah blah

};
#endif

// myclass.cpp
#include "myclass.h"

void myFunc::myClass() {
   // etc
}

// main.cpp

#include "myclass.h"

int main() {

    myClass myObj;

}

Thanks! Your suggestion solved the errors! My only question is, why do i need the #ifndefine, #define, #endif etc. ?

Thanks! Your suggestion solved the errors! My only question is, why do i need the #ifndefine, #define, #endif etc. ?

It's to prevent multiple inclusions. Let's take that previous example that we had before, but now you need to include this class in other files as well:

// otherclass.cpp

#include "myclass.h"

// blah blah blah

// anotherclass.cpp

#include "myclass.h"

// blah blah blah

Now, normally the header code would be pasted into the cpp files by the compiler's preprocessor. But this would cause errors because you are redefining the class. You are only allowed to define a class once. Using #ifndef/#define/#endif checks to see if it has already been included by another file. If so, it does nothing, and no errors happen.

I see, so the commands that start with "#" are messages to the compiler. Thanks alot!

>I see, so the commands that start with "#" are messages to the compiler.
Yup. The technical name for them is "preprocessor directives", so don't freak out if you hear that term. :)

>Thanks alot!
Glad I could help.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.