| | |
Problems Linking C++ Files
Please support our C++ advertiser: Intel Parallel Studio Home
Thread Solved |
•
•
Join Date: Mar 2007
Posts: 9
Reputation:
Solved Threads: 0
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
Untitled.cpp
MyClass.cpp
OtherClass.cpp
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?
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:
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:
C++ Syntax (Toggle Plain Text)
// 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; }
Last edited by John A; Mar 10th, 2007 at 7:17 pm.
"Technological progress is like an axe in the hands of a pathological criminal."
All my posts may be freely redistributed under the terms of the MIT license.
All my posts may be freely redistributed under the terms of the MIT license.
•
•
•
•
Thanks! Your suggestion solved the errors! My only question is, why do i need the #ifndefine, #define, #endif etc. ?
C++ Syntax (Toggle Plain Text)
// 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.
"Technological progress is like an axe in the hands of a pathological criminal."
All my posts may be freely redistributed under the terms of the MIT license.
All my posts may be freely redistributed under the terms of the MIT license.
>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.
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.
"Technological progress is like an axe in the hands of a pathological criminal."
All my posts may be freely redistributed under the terms of the MIT license.
All my posts may be freely redistributed under the terms of the MIT license.
![]() |
Similar Threads
Other Threads in the C++ Forum
- Previous Thread: wireless network programming in c++
- Next Thread: ifstream help
| Thread Tools | Search this Thread |
api array arrays based beginner binary c++ c/c++ calculator char char* class classes code compile compiler console conversion count delete deploy desktop directshow dll download dynamic dynamiccharacterarray encryption error file forms fstream function functions game givemetehcodez google graph gui homeworkhelp homeworkhelper iamthwee ifstream input int integer java lib linkedlist linker linux list loop looping loops map math matrix memory news number numbertoword output parameter pointer problem program programming project python random read recursion recursive reference return rpg sorting string strings struct temperature template templates test text text-file tree unix url variable vector video visual visualstudio win32 windows winsock wordfrequency wxwidgets






