i have compiled c++ files and make it as a lib using cygwin in windows. when i try to use that lib in visual studio 2005 c++. it produces the following errors.
"Error 1 error LNK2001: unresolved external symbol ___gxx_personality_v0 mylib.lib
Error 2 error LNK2019: unresolved external symbol __Unwind_Resume referenced in function _fjfx_create_fmd_from_raw mylib.lib
Error 3 error LNK2019: unresolved external symbol ___chkstk referenced in function __fjjj mylib.lib"
how to resolve it.
Yes, you need to build your library using the visual studio tools. The "gxx_personality_v0" is a symbol created by the g++ compiler, and can only be resolved by linking with the relevant libstdg++ library. Same for the other components.
Unfortunately, some parts of the runtime support for one compiler doesn't match when using a different compiler.
You could possibly get away with it if you link your Visual Studio code with the relevant GNU libraries, but I'm far from convinced.
[And I fully expect you to explain that the reason you compiled using cygwin is that the code contains a bunch of stuff that can't be compiled with Visual Studio because it uses gnu compiler extension features...]
Related
I've built a C++ Windows dll using Visual Studio - a.dll.
I used Cygwin and MinGW (x86_64-w64-mingw32-gcc) to build a helper C library - helper.lib.
The dll needs to use the helper library, so I modified Visual Studio project, tried to link with the library, but I get:
error LNK2019: unresolved external symbol __mingw_vsnprintf referenced in function inquiry where inquiry is one of the functions inside helper.lib.
What am I doing wrong?
I am trying to compile networking dll project in Visual Studio 2010. In past, the original authors used the project to produce standalone dll file that could be distributed with the server it was used for. If I open their dll, I cans see this in dependency walker (the red items are not really an issue, the dll works):
Now I tried to compile the project, but for both 32bit and 64bit (and 64bit is what I'm supposed to get to work) I produce a library that requires OpenSSL installed:
Trying to put the libeay32.lib out of the build just causes link errors:
1> Finished searching libraries
1>TTClient.obj : error LNK2001: unresolved external symbol _BF_set_key
1>TTProtocol.obj : error LNK2001: unresolved external symbol _BF_ecb_encrypt
1>D:\techsys\WebSightR220lib\Release\WebSightR220lib.dll : fatal error LNK1120: 2 unresolved externals
Turns out linking seemingly huge static library is not as big problem when you want to use just a fraction of OpenSSH. The compiler will not just copy the library in your binary, it will just pick the parts that are needed.
I am trying to use a library compiled with mingw in visual studio. However, I get the following linker errors:
error LNK2001: unresolved external symbol __imp___iob
error LNK2019: unresolved external symbol __imp___pctype referenced in function
error LNK2019: unresolved external symbol __imp____mb_cur_max referenced in function
error LNK2001: unresolved external symbol _fprintf
I was able to fix the _fprintf error by linking against legacy_stdio_definitions.lib as per this post : unresolved external symbol __imp__fprintf and __imp____iob_func, SDL2.
However, I have no idea how to fix the other three unresolved externals. How can I fix this? The libraries work perfectly under Visual Studio 2013.
Edit:
Okay here is an update. I moved libmsvcrt.a from the mingw lib folder into Visual Studio, and I added that to the linker settings. Now it seems to work correctly.
The libraries were compiled against an old version of the CRT. The unresolved symbols you get are internal symbols of the CRT that are present in the compiled library. You have to recompile the library against the VS2015 CRT (the Universal CRT). But I'm not sure if MinGW supports this.
If you can't do that, you have to continue to use the VS2013 compiler. (You can use the VS2015 IDE, by setting the toolset to vs2013 in the project options. But you'll still be limited to the C++ features the 2013 compiler supports.)
I encountered the same problem (library compiled with static CRT instead of CRT in DLL) and I managed to make it work by changing the two following parameters in Project Properties:
Linker > Input > Ignore specific default libraries: libc.lib
C/C++ > Code Generation > Runtime Library: Multi-threaded Debug (/MTd)
If that's not enough, there's more at following page: https://social.msdn.microsoft.com/Forums/en-US/841e5723-bce4-4340-b7b3-027dcdf90f00/
I switched my Visual C++ 2012 project from Multi-threaded Debug (/MTd) to Multi-threaded Debug DLL (/MDd). The project is a mixture of C++ .vcxproj and Intel Fortran (.vfproj) projects. After all is rebuild I get the errors below.
In CRT source code I see the offending symbols are defined in crt0dat.c if CRTDLL symbol is not defined. How do I make sure I get crt0dat with CRTDLL when compiling main application?
Any other suggestions how do I troubleshoot this?
50>cmain.obj : error LNK2019: unresolved external symbol _initp_misc_cfltcvt_tab referenced in function wWinMain
50>cmain.obj : error LNK2001: unresolved external symbol _FPinit
50>C:\spm\git\clones\SPM80_dll\MSBuild\x64\dll_debug\SPM_dll_debug_x64.exe : fatal error LNK1120: 2 unresolved externals
I believe /MDd builds require msvcrtd.lib. This should be something that automatically gets linked into your project; it might be that it's ignored through a project setting. Open the Project Settings for the C++ project and look under Linker->Input. There are settings there for Ignore All Default Libraries and Ignore Specific Default Libraries. See if there's anything there that might cause the linker to ignore msvcrtd.lib.
BTW, your code will also need the appropriate DLL to run, which for VS 2012 would be msvcr110d.dll. This should already installed on your machine when you installed VS 2012, but it will have to be distributed with the executable if you move it to another computer.
So I am trying to compile legacy app from 32 bit to 64 bit..
I re-compiled all of the libs it used and made it look into WIN SDK6.0A x64 bit for libs..
I am using:
Visual Studio Professional Edition 2008
Visual C++
dotNet Framework 3.5 SP1
Windows Server 2008R2
Windows SDK is 6.0A
Everythings finally coming up but I am getting these weird undefined symbol errors:
error LNK2019: unresolved external symbol InterlockedDecrement referenced in function ...
error LNK2019: unresolved external symbol InterlockedIncrement referenced in function ...
error LNK2019: unresolved external symbol GetModuleBaseName referenced in ...
error LNK2019: unresolved external symbol EnumProcessModules referenced in ...
error LNK2019: unresolved external symbol EnumProcesses referenced in ...
error LNK2019: unresolved external symbol GetProcessMemoryInfo referenced
The problem is these are all win stuff from SDK.
InterlockedDec and InterlockedInc are coming from kernel32.lib
GetModuleBaseName, EnumProcessModules, EnumProcesses,GetProcessMemoryInfo are in psapi.h but also kernel32.lib or psapi.lib
I checked C:\Program Files\Microsoft SDKs\Windows\v6.0A\Lib\x64 and both libs
kernel32.lib and psapi.lib are there.
It definitely looks up the libs at right spot. I turned on /VERBOSE:LIB
and it points to the correct folder.
So I am really confused why isnt it finding them.
Any ideas???
Thanks
So I finally figured it out, kinda...
It wasnt finding psapi.lib
In Project->Linker->Additional dependencies instead of just saying psapi.lib
I gave full path to it and it worked...
not really sure why it failed to find it before but oh well...
This is very long shot (and I don't really believe this is it) but maybe the headers are not properly guarded with extern "C" for c++ compilation? Are you including system headers or just declaring the functions yourself?
Can you post your compile and link command lines, and any #def's in your code?
Does this happen if you make a simple project from scratch that only calls one of those methods?
For the record: Same problem, different solution;
I had an entry for the directory
psapi
added in the list of
Linker/General/Additional Library Directory
This resulted in the usage of the old VS2005 platform sdk psapi.lib (it only had x86, no x64 version).
After removing the entry the correct lib from the installed WinSDK x64/psapi.lib is used now.
So keep an eye out for mixings/ordering of old & new SDKs!
Obviously the full path will also work but might be a problem when you use the project on multiple machines.
In my case(migrate from VS2008 to VS2012), issue solved after adding psapi.lib in Linker->input->Additional Dependencies in VS 2012.