link error when change configuration from Debug to Release - c++

Hi
I have project In VC++ 2008
this project compile in debug mode without error
but when I try to build it in release mode I get below linking erorr.
1>Linking...
1>LIBCMTD.lib(dbgheap.obj) : error LNK2005: __heap_alloc already defined in LIBCMT.lib(malloc.obj)
1>LIBCMTD.lib(dbgheap.obj) : error LNK2005: __recalloc already defined in LIBCMT.lib(recalloc.obj)
1>LIBCMTD.lib(dbgheap.obj) : error LNK2005: __msize already defined in LIBCMT.lib(msize.obj)
1>LIBCMTD.lib(malloc.obj) : error LNK2005: _V6_HeapAlloc already defined in LIBCMT.lib(malloc.obj)
1>LIBCMTD.lib(dbghook.obj) : error LNK2005: __crt_debugger_hook already defined in LIBCMT.lib(dbghook.obj)
1>LIBCMTD.lib(sbheap.obj) : error LNK2005: ___sbh_pHeaderDefer already defined in LIBCMT.lib(sbheap.obj)
1>LIBCMTD.lib(sbheap.obj) : error LNK2005: __get_sbh_threshold already defined in LIBCMT.lib(sbheap.obj)
1>LIBCMTD.lib(sbheap.obj) : error LNK2005: __set_sbh_threshold already defined in LIBCMT.lib(sbheap.obj)
1>LIBCMTD.lib(sbheap.obj) : error LNK2005: __set_amblksiz already defined in LIBCMT.lib(sbheap.obj)
1>LIBCMTD.lib(sbheap.obj) : error LNK2005: __get_amblksiz already defined in LIBCMT.lib(sbheap.obj)......
how I can fix it?
thanks.

You're mixing VS runtimes - Make sure the "Project Properties/C++/Code Generation/Run-time Library" setting is the same for your project and all libraries you link to.

I had the same problem as you. Reason of this problem is that Linker include a lot of libraries that you dont see (for example you will include windows.h, it includes windef.h and so on...). And because these files are not idiot-proof written (#ifndef is missing) linker will try to #define same thing more times than once - problem.
My solution was setting this field:
Project Properties -> Linker -> Input -> Ignore specific library
to "libcmt.lib"
With this your linker will ignore also in release configuration that problematic library that is included by default and everything should work.. :-)
Have a nice day.. :-)
P.S. If you want to avoid these linker misunderstandings, keep configuring project not in debug or release configuration, but in "All configuration". This option is on left upper corner of project configuration.

You are linking a .obj or .lib file that was compiled in the Debug configuration. Best thing to do is to ensure that file is built in the Release mode as well. Second best is to tell the linker to ignore the request to link to libcmtd.lib. Project + Properties, Linker, Input, Ignore Specific Library = libcmtd.lib. But only do this if you can't get the Release build of a .lib after trying mightily.

you can delete preprocessor definition "DEBUG" to solve your issue

I ran into to similar problem and it was all to do with whether libraries you include build with right end state. If you build a program in release mode and pointed to *.lib files that compiled in debug mode. its going to give you symbol miss match errors. Specially if your program build fines in debug mode or vise versa.
This might not exactly what your problem is but good information for someone who ran into same thing as i did.

You probably have defined all the link information in the "Debug" configuration. Which means you need to either redefine it for "Release" or move it to the "All Configurations" so its shared.

Related

c++ linker error LNK2005 already defined in SDL

I am compiling my program using VS2005. I am linking to SDL static libraries and am getting the following linker errors;
1>LIBCMTD.lib(fpinit.obj) : error LNK2005: __fltused already defined in SDL2d.lib(SDL_stdlib.obj)
1>LIBCMTD.lib(ftol2.obj) : error LNK2005: __ftol2_sse already defined in SDL2d.lib(SDL_stdlib.obj)
1> Creating library ..\..\..\product\VS2005\libs\\Standalone.lib and object ..\..\..\product\VS2005\libs\\Standalone.exp
1>..\..\..\product\VS2005\libs\\Standalone.exe : fatal error LNK1169: one or more multiply defined symbols found
I compiled SDL2d.lib using the same VS2005 compiler. My original thought was that I had mismatched runtime library settings for these projects. However after checking they are both set to Multi-Threaded Debug.
I have just noticed that the linker output above seems to be creating a Standalone.lib and Standalone.exp before making the Standalone.exe. I have no idea why it's making a .lib and .exp
Any other reasons why this error would occur?
Thanks
Needed to define HAVE_LIBC in the SDL project. This stopped the multiple redefinition of both _ftlused and _ftol2_sse

Linking against a .lib causes many multiply defined symbols [duplicate]

I have a large and complicated project that is finally getting unit tests. I've built googleTest 1.6.0 locally with Visual Studio 2010, the project files built with cmake as the README specifies.
This project has many dependent libraries that are statically and dynamically linked. Many of them proprietary. All attempts to link generate 220 such errors. Here is a sampling:
msvcprtd.lib(MSVCP100D.dll) : error LNK2005: "public: void __cdecl std::_Container_base12::_Orphan_all(void)" (?_Orphan_all#_Container_base12#std##QEAAXXZ) already defined in gtest.lib(gtest-all.obj)
libcpmtd.lib(cerr.obj) : error LNK2005: "protected: char * __cdecl std::basic_streambuf >::_Gndec(void)" (?_Gndec#?$basic_streambuf#DU?$char_traits#D#std###std##IEAAPEADXZ) already defined in msvcprtd.lib(MSVCP100D.dll)
LIBCMTD.lib(setlocal.obj) : error LNK2005: _configthreadlocale already defined in MSVCRTD.lib(MSVCR100D.dll)
LINK : warning LNK4098: defaultlib 'MSVCRTD' conflicts with use of other libs; use /NODEFAULTLIB:library
LINK : warning LNK4098: defaultlib 'LIBCMTD' conflicts with use of other libs; use /NODEFAULTLIB:library
fatal error LNK1169: one or more multiply defined symbols found
I've tried the /NODEFAULTLIB flag, and I've tried to ignore just msvcprtd.lib, MSVCRTD.lib, and LIBCMTD.lib, as suggested, but then I suffer from unresolved symbols...
Both the project and googleTest are compiled with x64, /MP, /MDd, and no /clr.
I've been playing around with compiler flags, wondering if there's some sort of version mismatch. Dumpbin, to the extent with which I understand it, hasn't hinted anything I might understand. I was hoping for an er
It looks like your question is answered in Google Talk's FAQ. Make sure all your libraries use the /MD(d) setting.
You may get a number of the following linker error or warnings if you attempt to link your test project with the Google Test library when your project and the are not built using the same compiler settings.
LNK2005: symbol already defined in object
LNK4217: locally defined symbol 'symbol' imported in function 'function'
LNK4049: locally defined symbol 'symbol' imported
The Google Test project (gtest.vcproj) has the Runtime Library option set to /MT (use multi-threaded static libraries, /MTd for debug). If your project uses something else, for example /MD (use multi-threaded DLLs, /MDd for debug), you need to change the setting in the Google Test project to match your project's.
To update this setting open the project properties in the Visual Studio IDE then select the branch Configuration Properties | C/C++ | Code Generation and change the option "Runtime Library". You may also try using gtest-md.vcproj instead of gtest.vcproj.

Is It possible to Linking static library into dynamic library in Visual Studio?

I am try to link a static library in a dynamic library tmxParser.lib in Visual Studio 2010 express. I have the static library set as a dependency of the dynamic library. When VS build the static library builds fine and creates tmxParser.lib. When VS builds the dynamic library I am getting linker errors. I tried to match the Runtime Library under property page -> Configuration properties -> C/C++ -> Code Generation
It doesn't help. Anyone have any idea?
2>LIBCMTD.lib(fopen.obj) : error LNK2005: _fopen already defined in s3e_d.lib(iwcrt_stdio.obj)
2>LIBCMTD.lib(open.obj) : error LNK2005: __open already defined in s3e_d.lib(iwcrt_win32.obj)
2>LIBCMTD.lib(open.obj) : error LNK2005: __sopen already defined in s3e_d.lib(iwcrt_win32.obj)
2>LIBCMTD.lib(chsize.obj) : error LNK2005: __chsize already defined in s3e_d.lib(iwcrt_win32.obj)
2>LIBCMTD.lib(read.obj) : error LNK2005: __read already defined in s3e_d.lib(iwcrt_win32.obj)
2>LIBCMTD.lib(close.obj) : error LNK2005: __close already defined in s3e_d.lib(iwcrt_win32.obj)
2>LIBCMTD.lib(lseek.obj) : error LNK2005: __lseek already defined in s3e_d.lib(iwcrt_win32.obj)
2>LIBCMTD.lib(setmode.obj) : error LNK2005: __setmode already defined in s3e_d.lib(iwcrt_win32.obj)
When you say you have it set as a dependency, do you mean you have it set as a Project Dependency or is under "Additional Dependencies" in
Project Properties -> Librarian->General -> Additional Dependencies
Generally, yes.
The problem you have seems to be that the library (is it the marmalade library?) implements some of the methods from the C++ runtime library. Probably, this lib is supposed to be used without linking the standard runtime library.
Possible solutions:
do not link c++ runtime in your DLL. That should be possible if you write just a thin wrapper
Ask the guys making the lib how they thought this is supposed to work
use the lib.exe or dumpbin.exe to:
extract all .obj files of the lib
remove the conflicting symbols from the .obj files
recreate the lib
The latter is obviously an ugly hack, and should be reserved for cases where neither source nor original developer are available anymore.

Linker Errors due to being Already Defined

It has been about a year since I wrote any .dll plugins that use LibCurl, but I decided to start on another one tonight. Unfortunately, I have been combating the same linker errors for almost 4 hours now, and I am completely lost.
I am statically building LibCurl, and it appears to be fine for the most part, except I am getting the following linker errors.
1>MSVCRT.lib(MSVCR90.dll) : error LNK2005: _calloc already defined in memoverride.obj
1>MSVCRT.lib(MSVCR90.dll) : error LNK2005: _realloc already defined in memoverride.obj
1>MSVCRT.lib(MSVCR90.dll) : error LNK2005: _free already defined in memoverride.obj
1>MSVCRT.lib(MSVCR90.dll) : error LNK2005: _malloc already defined in memoverride.obj
1>MSVCRT.lib(MSVCR90.dll) : error LNK2005: __strdup already defined in memoverride.obj
1>MSVCRT.lib(MSVCR90.dll) : error LNK2005: __malloc_crt already defined in memoverride.obj
I have tried...
1) Reorganizing my included libs due to MSDN saying LNK2005 was caused by this.
2) Rebuilding the LibCurl lib through MSVC Application, then through the Command-Line tool.
3) Excluding the libs that are causing issues.
and a bunch of other things that I cannot even remember now. Can anyone help me out with some information as to how I can solve these?
Problem was my .dll was /MT while the libcurl was /MD. Also, I had initially blocked "libcmt", so when I was switching libcurl to /MT, it was spewing errors.

How to use CLR in a different runtime environments under multiple projects in visualstudio?

Here is My Scenario.
I have an Existing Solution in visualstudio which contains 15 projects.
in some project i need to use managed c++ extensions. So first i have a workaround for sample solution contains 4 projects in those i have maintained dependencies b/w them.
and my solution is builded also.
I apply the same procedure to existing solution by adding extra project which contains managed code.so that i enable CLR in calling project(from where i call new added project methods from existing ex:demoproj) as well as project which contains main().and change the runtime from /mtd(existing one contains /mtd) to /mdd.
when i build the demoproj it builds success fully. But when i building project which contains main() it gives lot of errors like
LINK : warning LNK4098: defaultlib 'MSVCRTD' conflicts with use of other libs; use /NODEFAULTLIB:library
LIBCMTD.lib(winxfltr.obj) : error LNK2005: __XcptFilter already defined in MSVCRTD.lib(MSVCR80D.dll)
LIBCMTD.lib(invarg.obj) : error LNK2005: __invalid_parameter already defined in MSVCRTD.lib(MSVCR80D.dll)
LIBCMTD.lib(invarg.obj) : error LNK2005: __invoke_watson already defined in MSVCRTD.lib(MSVCR80D.dll)
LIBCMTD.lib(crt0.obj) : error LNK2005: _mainCRTStartup already defined in MSVCRTD.lib(crtexe.obj)
LIBCMTD.lib(fclose.obj) : error LNK2005: _fclose already defined in MSVCRTD.lib(MSVCR80D.dll)
LIBCMTD.lib(printf.obj) : error LNK2005: _printf already defined in MSVCRTD.lib(MSVCR80D.dll)
LIBCMTD.lib(mbstowcs.obj) : error LNK2005: _mbstowcs already defined in MSVCRTD.lib(MSVCR80D.dll)
I found this is happend because of using /clr option i think any idea???
But this case is not happend for my test solution.How to resolve this
Any help is greatly appreciated
All the dlls you link to using import libraries must have the same setting as the application for how you link to the runtime library. The errors are showing that you are mixing use of the runtime as a .dll (MSVCRTD) and as a .lib (LIBCMTD).