-
January 13th, 2006, 04:54 AM
#1
error LNK2005:
Hello,
In my Dialog based project, I am using CCriticialSection objets in one class, CSerial(Serial.cpp & Serial.h). And this class members are called in ADlg(main Dialog box file).
When I am building this file, it gives this kind of linker errors.
Code:
Linking...
AP2.obj : error LNK2005: "class CCriticalSection _critWrite" (?_critWrite@@3VCCriticalSection@@A) already defined in AP1.obj
AP2.obj : error LNK2005: "class CCriticalSection _critRead" (?_critRead@@3VCCriticalSection@@A) already defined in AP1.obj
Agx3313P1.obj : error LNK2005: "class CCriticalSection _critWrite" (?_critWrite@@3VCCriticalSection@@A) already defined in Agx3281P1.obj
Agx3313P1.obj : error LNK2005: "class CCriticalSection _critRead" (?_critRead@@3VCCriticalSection@@A) already defined in Agx3281P1.obj
Agx3313P2.obj : error LNK2005: "class CCriticalSection _critWrite" (?_critWrite@@3VCCriticalSection@@A) already defined in Agx3281P1.obj
Agx3313P2.obj : error LNK2005: "class CCriticalSection _critRead" (?_critRead@@3VCCriticalSection@@A) already defined in Agx3281P1.obj
Argus.obj : error LNK2005: "class CCriticalSection _critWrite" (?_critWrite@@3VCCriticalSection@@A) already defined in Agx3281P1.obj
Argus.obj : error LNK2005: "class CCriticalSection _critRead" (?_critRead@@3VCCriticalSection@@A) already defined in Agx3281P1.obj
ArgusDlg.obj : error LNK2005: "class CCriticalSection _critWrite" (?_critWrite@@3VCCriticalSection@@A) already defined in Agx3281P1.obj
ArgusDlg.obj : error LNK2005: "class CCriticalSection _critRead" (?_critRead@@3VCCriticalSection@@A) already defined in Agx3281P1.obj
Serial.obj : error LNK2005: "class CCriticalSection _critWrite" (?_critWrite@@3VCCriticalSection@@A) already defined in Agx3281P1.obj
Serial.obj : error LNK2005: "class CCriticalSection _critRead" (?_critRead@@3VCCriticalSection@@A) already defined in Agx3281P1.obj
Debug/Argus.exe : fatal error LNK1169: one or more multiply defined symbols found
Build log was saved at "file://d:\users\jk\NetProjects\Vcnet\Argus\Argus\Debug\BuildLog.htm"
Argus - 13 error(s), 0 warning(s)
Kindly Suggest,
Regards,
JK
-
January 13th, 2006, 04:59 AM
#2
-
January 13th, 2006, 05:09 AM
#3
Re: error LNK2005:
.. DARN you beat me to it. .. but here it goes anyway
symbol already defined in object
The given symbol, displayed in its decorated form, was multiply defined.
Tips
One of the following may be a cause:
· The most common cause of this error is accidentally linking with both the single-threaded and multithreaded libraries. Ensure that the application project file includes only the appropriate libraries and that any third-party libraries have appropriately created single-threaded or multithreaded versions.
· The given symbol was a packaged function (created by compiling with /Gy) and was included in more than one file but was changed between compilations. Recompile all files that include the symbol.
· The given symbol was defined differently in two member objects in different libraries, and both member objects were used.
· An absolute was defined twice, with a different value in each definition.
This error is followed by fatal error LNK1169.
You probobly have a symbol "..CCritical..." defined differently in different modules.
Try rebuilding you're whole project, then checking if each instance of CCrit... is defined the same in each module.
Rate this post if it helped you.
-
January 13th, 2006, 09:43 AM
#4
Re: error LNK2005:
Hi Andreas,
As mentioned in the link you have sent, I just changed the CCriticalSection objects in Serial.h to static CCriticalSection objects and rebuild - all errors gone!
Can you give me a brief - why is it so?
Any way, thanks a lot for the link you given!
Regards,
JK
-
January 13th, 2006, 11:08 AM
#5
Re: error LNK2005:
The reason is simply that the header file containing the critical section gets included by more than one file.
Since the compiler translates each source file on its own...in a so-called translation unit, preprocessor directives such as inclusion guards (that are supposed to prevent multiplu defined symbols) are not stored across different translation units, thus, it won't prevent multiple inclusions of the file in different units. Inclusion guards only prevent the inclusion of the same header more than once in the same compilation unit.
By addind the 'static' keyword, you basically created several static variables of the critical section, each one local to one translation unit. I am not sure whether this is what you actually want. However, without knowing what you are trying to accomplish, it is hard to tell...
-
January 13th, 2006, 12:46 PM
#6
Re: error LNK2005:
Hello Andreas,
Thank you for the explaination.
Actually I wanted to write mutithreaded functions for handling serial port operations, read & write. So, in a class named CSerial, I wanted to define 2 variables of CCriticalSection namely, _critRead & _critWrite - to handle serial port read & serial port write operations seperately.
Even before initializing these critical section variables as static, I was defining this header file(Serial.h) only once in main dialog box program(CArgusDlg.h) - not in other programs.
Regards,
JK
-
January 13th, 2006, 04:06 PM
#7
Re: error LNK2005:
Well...and how many files do include the header 'CArgusDlg.h'?
-
January 13th, 2006, 11:24 PM
#8
Re: error LNK2005:
Main Dialog box in my projects consists of 4 property pages + some controls. Depending on the tests I perform listed in these property pages, the control should go back to Main Dialog box.
So, I added the main dialog box header file(CArgusDlg.h) in all 4 property pages header files. And I am calling main dialog box from property pages like this,
Code:
CArgusDlg* adlg = (CArgusDlg*)AfxGetApp()->GetMainWnd();
// CArgusDlg* adlg = (CArgusDlg*)AfxGetMainWnd();
adlg->EnableCombo(TRUE);
return FALSE;
You mean including this ArgusDlg.h in other files - is creating problems?
Regards,
JK
-
January 14th, 2006, 12:28 AM
#9
Re: error LNK2005:
If you
#include "ArgusDlg.h"
in a file, then you are including all files included in ArgusDlg.h in that file as well.
You are also including all files included in files included in ArgusDlg.h etc...
So you see that you are including the file containing the CCriticalSection more than once.
This does not address your design issue however.
Most likely a class that is going to synchronize access to a serial port should be implelmented as a singleton and your critical section should just be a member of this class.
I am assuming that you had it as a global variable to get the linking problem.
Making it static is not the solution.
Wakeup in the morning and kick the day in the teeth!! Or something like that.
"i don't want to write leak free code or most efficient code, like others traditional (so called expert) coders do."
-
January 14th, 2006, 06:51 AM
#10
Re: error LNK2005:
Originally Posted by chakrijk
You mean including this ArgusDlg.h in other files - is creating problems?
Yes...as souldog already pointed out...
As I understand it, you want to synchronize the access of the serial port. Thus, the best location for placing this synchronization is simply at the closest point...in your serial communication class. The code snippet you posted shows something different, thus, I am not sure what the relation between the property pages and the serial port is...
-
August 30th, 2010, 08:17 PM
#11
Re: error LNK2005:
Just had this problem about some functions in a template class where the class was declared and defined in one header file. Simple fix was to include the header in main.cpp instead of stdafx.h
? works
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|