Command Prompt VS 2010: Fix MSVCRT.lib(MSVCR100.dll) : error LNK2005: xxx already defined in LIBCMT.lib(xxx.obj)
One of my task is to use Command Prompt of Visual Studio 2010 to evaluate the assignments of students. This assignment is about pointer and memory management in C++.
The students are required to use new and delete operator in C++ to manage the memory and they need to ensure that the number of new callings must be equal to the number of delete callings.
I overload the new and delete operator, build it into a static library (.lib file) and require student to use this .lib file when implementing the assignment.
There is no problem when building the .lib file in VS 2010 project, but there are errors when compile the source code if I link the source code to the above static .lib file.
Here is the format of error:
The first one is to remove the default lib when compiling the source code, it's libcmt.lib, because this libcmt.lib already defines the operators that I overload. This lib supports multi-thread and of course, it is out of scope of this assignment. So, I feel secure when remove this lib.
The second one, the better solution, is to change the mode of CRT from static to dynamic mode. This solution solves the root cause of this error.
Get some sleep now!
I get this solution from here: http://fixunix.com/programmer/95174-use-nodefaultlib-library.html
The students are required to use new and delete operator in C++ to manage the memory and they need to ensure that the number of new callings must be equal to the number of delete callings.
I overload the new and delete operator, build it into a static library (.lib file) and require student to use this .lib file when implementing the assignment.
There is no problem when building the .lib file in VS 2010 project, but there are errors when compile the source code if I link the source code to the above static .lib file.
Here is the format of error:
MSVCRT.lib(MSVCR100.dll) : error LNK2005: xxx already defined in LIBCMT.lib(xxx.obj)Fortunately, I found 2 ways to fix this error on the internet.
The first one is to remove the default lib when compiling the source code, it's libcmt.lib, because this libcmt.lib already defines the operators that I overload. This lib supports multi-thread and of course, it is out of scope of this assignment. So, I feel secure when remove this lib.
cl -o source.cpp xxx.lib /link /nodefaultlib:libcmt.lib(Note that you must include /link switch to make the prompt switch to linker; otherwise, the error will not be fixed.)
The second one, the better solution, is to change the mode of CRT from static to dynamic mode. This solution solves the root cause of this error.
cl /MD -o source.cpp xxx.libI will explain the detail solution next time. Compare between static and dynamic CRT. Why does the lib file use dynamic CRT, not static CRT?
Get some sleep now!
I get this solution from here: http://fixunix.com/programmer/95174-use-nodefaultlib-library.html
Comments
Post a Comment