I am using boost's threading library and have run into linking issues in Visual Studio.
Right now, I'm compiling my VS project with /MT. The library I'm linking against is called libboost_thread-vc100-mt-1_48.lib, which seems to indicate that it, too has been compiled using /MT.
However, if I turn off all /MD related libraries in my linker settings (properties -> Linker -> Input -> Ignore Specific Default Libraries)...
msvcrt.lib
msvcrtd.lib
msvcprt.lib
msvcprtd.lib
Then I get linker errors!
libboost_thread-vc100-mt-1_48.lib(thread.obj) : error LNK2001: unresolved external symbol __imp___gmtime64
libboost_thread-vc100-mt-1_48.lib(thread.obj) : error LNK2001: unresolved external symbol __imp___beginthreadex
How could this be possible just by turning off /MD related libraries? boost::thread should only be linking against libs in /MT (Which should be LIBCMT.LIB, LIBCPMT.LIB). Did I compile boost incorrectly?
BAM! Linker defeated!
It looks like my hunch was right. I didn't compile boost correctly. To emulate /MT with a boost build, you need to link against static runtime libraries (linking to dynamic runtime libraries seems to be the default).
The command to do this (for Release build of boost::thread) was:
.\b2 --with-thread variant=release link=static threading=multi runtime-link=static
Hope this helps someone out there using boost with /MT turned on in their project!
Related
We have a Visual Studio 2015 driver project. For various reasons, we use "make" (the unix tool, built for windows) to build our entire product. It is also preferred to use make to build the windows-only components (keeps the build process consistent).
Running Server 2012R2, VS 2015 Update 3, DDK 10 and SDK 10.
The project builds fine in VS2015 and the driver works, so, the codebase is good.
I enabled the verbose build output and captured that to analyze what VS is doing to build the project (the driver is simply a bunch of C files, does not appear to be anything too earth-shatteringly unique). The VS build sets LIB, LIBPATH and INCLUDE variables, then issues a "cl.exe" command to build, followed by a "link.exe" command to link. There are also commands to build the message file (mc.exe) and resource file "rc.exe". I captured all of these commands and incorporated them into a makefile.
I can get the project to compile but, my problem is with the link phase. I will show the error in a few lines. I have tried simply running the commands (from the log) by themselves in a "VS2015 x64 Native Tools Command Prompt" (%comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat"" amd64) and I get the same error.
When I link, I get:
LINK : error LNK2001: unresolved external symbol GsDriverEntry
os_win.obj : error LNK2001: unresolved external symbol __stdio_common_vsprintf
winbuild\x64\Win7Release\driver.sys : fatal error LNK1120: 2 unresolved externals
I had to make one change from the cl.exe command line that VS logged, which was to specify /GS- (VS enabled the option). Otherwise, when I run the compile and link comands, I get a bunch of additional errors:
os_win.obj : error LNK2001: unresolved external symbol __security_cookie
So, Googling the vsprintf error, I came across suggestions to link with legacy_stdio_definitions.lib to access those functions, but that did not work (and using cygwin's nm.exe to examine the lib, showed that the vsprintf functions are Undefined.
If I build from the makefile, I lose the error about GsDriverEntry being undefined but I still have the vsprintf errors.
I tried also removing the /nodefaultlib link option... no effect.
So, I am at a complete loss as to what is going on. It makes no sense to me that, VS can build the project, but I cannot, using the same commands. What details or concept am I missing?
My link command line:
link /OUT:Win7Release/driver.sys \
/NOLOGO /INCREMENTAL:NO /IGNOREIDL /OPT:ICF /MAP /SUBSYSTEM:CONSOLE /OPT:REF \
/PDB:none /MACHINE:X64 /MANIFEST:NO /WX /PROFILE /kernel /Driver /RELEASE \
/VERSION:"10.0" /osversion:10.0 /ENTRY:"GsDriverEntry" \
/IGNORE:4198,4010,4037,4039,4065,4070,4078,4087,4089,4221,4108,4088,4218,4218,4235 \
/ERRORREPORT:PROMPT /MERGE:"_TEXT=.text;_PAGE=PAGE" /SECTION:"INIT,d" \
/IMPLIB:"Win7Release/driver.lib" /SUBSYSTEM:NATIVE",6.01" \
.. list of obj files .. \
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib \
shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib \
legacy_stdio_definitions.lib ntoskrnl.lib hal.lib wmilib.lib BufferOverflowK.lib
Okay, well, I found this post, which helped me earlier this year with another similar problem... seems that vsprintf is also declared inline, now. Setting _NO_CRT_STDIO_INLINE as /D option to cl.exe allows the code to build AND link.
So.. why would the Visual Studio 2015 project build properly? That define is NOT in the build output.
I have a C++ project using Qt5 (also compiles with Qt4) which I want to make available in python (preferable 3.4). In order to do this I use PyQt4 (because of the QtXml module which is, as far as I know, not available in PyQt5 anymore) and sip. This all works perfectly on my linux machine. But unfortunately I need it for windows and can't get it run. What I have done so far:
A very small example without Qt or other dependencies (one function which returns an integer) works. Even with gcc. But after an "bad reloc" error in my project I switched to the MSVC
My python 3.4 was build with "MSC v.1600 32 bit (Intel)" "on win32" so according to What version of Visual Studio is Python on my computer compiled with? I downloaded Qt 5.2.1 MSVC2010 and Microsoft Visual Studio Express 2010 SP1
I assume that the precompiled PyQt4-4.11.2-gpl-Py3.4-Qt5.3.1-x32 should fit
In order to get the sip.h and sipconfig.py file I compiled sip (4.16.3).
From now on I am unsure what to do. I have to admit that I have no knowledge about libraries.
The C++/Qt project is compiled with QtCreator with CONFIG += staticlib and TEMPLATE = lib. The resulting *.lib (here: xml2db.lib) is been copied to the folder where my sip files are (e.g. sipxml2dbcmodule.cpp)
So via the "VS Command Prompt" nmake throws fatal (link) errors. I'm unsure what the needed compiler flags should be or if the staticlib is wrong. My flags are:
LFLAGS = /NOLOGO /DYNAMICBASE /NXCOMPAT /DLL /MANIFEST /MANIFESTFILE:$(TARGET).manifest /SUBSYSTEM:WINDOWS /INCREMENTAL:NO /NODEFAULTLIB:library /LIBPATH:/LIBPATH:C:\Qt\5.2.1\msvc2010\lib
LIBS = /LIBPATH:C:\Python34\libs python34.lib xml2db.lib /LIBPATH:C:\Qt\5.2.1\msvc2010\lib\Qt5Xmld.lib C:\Qt\5.2.1\msvc2010\lib\Qt5Sqld.lib C:\Qt\5.2.1\msvc2010\lib\Qt5Cored.lib
$(TARGET): $(OFILES)
$(LINK) $(LFLAGS) /OUT:$(TARGET) $(OFILES) $(LIBS)
Where target is "myTools.pyd". It results in
sipmyToolscmodule.cpp
sipmyToolsxml2db.cpp
Generating Code...
link /NOLOGO /DYNAMICBASE /NXCOMPAT /DLL /MANIFEST /MANIFESTFILE:myTools
.pyd.manifest /SUBSYSTEM:WINDOWS /INCREMENTAL:NO /NODEFAULTLIB:library /LIBPATH:
C:\Qt\5.2.1\msvc2010\lib /OUT:myTools.pyd sipmyToolscmodule.obj sipmyToolsxml2db
.obj /LIBPATH:C:\Python34\libs python34.lib xml2db.lib /LIBPATH:C:\Qt\5.2.1\msvc
2010\lib\Qt5Xmld.lib C:\Qt\5.2.1\msvc2010\lib\Qt5Sqld.lib C:\Qt\5.2.1\msvc2010\l
ib\Qt5Cored.lib
xml2db.lib(xml2db.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_L
EVEL': value '2' doesn't match value '0' in sipmyToolscmodule.obj
MSVCRTD.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_i
nfo(class type_info const &)" (??0type_info##AAE#ABV0##Z) already defined in LIB
CMT.lib(typinfo.obj)
MSVCRTD.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __thiscall
type_info::operator=(class type_info const &)" (??4type_info##AAEAAV0#ABV0##Z)
already defined in LIBCMT.lib(typinfo.obj)
Creating library myTools.lib and object myTools.exp
LINK : warning LNK4098: defaultlib 'MSVCRTD' conflicts with use of other libs; u
se /NODEFAULTLIB:library
myTools.pyd : fatal error LNK1169: one or more multiply defined symbols found
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 10.0
\VC\BIN\link.EXE"' : return code '0x491'
Stop.
I would be pleased for an answer or fresh idea. Thanks in advance.
EDIT
I don't know exactly how I solved it but here are a few more hints that helped me to solve it.
Since sip 5 won't have the build system I tried to create a qmake project. To do so I downloaded the pyqt source package and looked at the project files and adjusted it to my needs.
Especially when you are changing the qmake project file it might be usefull to delete the make, object and/or moc files.
The qt version should perfectly match to the pyqt version (actually I don't mean the version itself but the qt version it was compiled for)
Good luck for those who have similiar problems
I'm trying to link a Windows executable that depends on a several static libraries (some of which I have built, some of which I have not). When I do the link, I get a flock of errors like:
LIBCMT.lib(mlock.obj) : error LNK2005: _unlock already defined in MSVCRT.lib(MSVCR100.dll)
which is the classic /MD vs. /MT problem (whether the C runtime is statically or dynamically linked). I tried the easy solution first, adding the linker flags
/nodefaultlib:libcmt /nodefaultlib:libcpmt
but that just gave different errors:
msvcprt.lib(MSVCP100.dll) : error LNK2005: "public: __cdecl std::_Locinfo::~_Locinfo(void)" (??1_Locinfo#std##QEAA#XZ) already defined in gtest.lib(gtest-all.cc.obj)
gtest.lib(gtest-all.cc.obj) : error LNK2001: unresolved external symbol "private: static int std::locale::id::_Id_cnt" (?_Id_cnt#id#locale#std##0HA)
I've gone through the libraries I'm building, and as far as I can tell I'm building them all /MD. I say "as far as I can tell" because some of them are third-party libraries that come with their own makefiles so I don't have complete control over the build process..
I don't think "depends" works on libraries (only EXEs and DLLs), is there a tool that would let me look at the various libraries I'm linking in, and see which one is bringing in libcmt when I want to be using msvcrt instead?
I have had the same problem and I used dumpbin ( http://msdn.microsoft.com/en-us/library/z66yd3h6.aspx ) with /DIRECTIVES options on the libs. It will show a number of /DEFAULTLIB sections, each one is another lib that your lib try to use. Dumpbin needs to run from the Visual Studio command promt.
dumpbin /DIRECTIVES liblua52.lib
I had 100+ libs with all the solution configurations and platforms so I made a python 2.7 script (crtdisplay.py) to do it for me. It can be found on my bitbucket repository at https://bitbucket.org/vimarina/ctrlcv/src/57b7ddca15b5c7fefddcf20ffcea0633223a4bd6/crtdisplay . Put it in the root directory of your libs. Not much error checking in that code so do not be surprised if it fails :). I used Visual Studio 2010 so might fail on other versions of Visual Studio.
crtdisplay.py > info.txt
I am using Visual Studio with a couple of Qt4 projects and I would like to switch to QtCreator, but keeping the msvc compiler.
After configuring everything in QtCreator I get this linker error:
LNK2001: unresolved external symbol _imp_SysAllocString#4
Any idea about what is going on? I don't get this error if I compile using Visual Studio.
You need to link against OleAut32.dll. Try adding this to your qmake project file:
win32: LIBS += -loleaut32 -lole32
I downloaded and compiled CppUnit to compile with Visual Studio 2010.
After the conversion, I could load the CppUnitLibraries, and it gives me cppunit.lib and cppunit_dll.lib/dll. After copying the headers and libs to a directory, I run this command to get a lot of errors.
I found the conflict of libraries as follows
LINK : warning LNK4098: defaultlib 'MSVCRTD' conflicts with use of other libs; use /NODEFAULTLIB:library
However, the following command doesn't seem to work.
cl main.cpp complex.cpp testset.cpp /I"C:\CppUnit\include" /link /libpath:"C:\CppUnit\lib" cppunit.lib /NODEFAULTLIB:library
What's wrong with them?
This is the command that I used for compilation/link.
cl main.cpp complex.cpp testset.cpp /I"C:\CppUnit\include" /link /libpath:"C:\CppUnit\lib" cppunit.lib
This is the error message from VS2010.
cppunit.lib(TestResult.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL':
...
node###Z) already defined in LIBCMT.lib(typinfo.obj)
LINK : warning LNK4098: defaultlib 'MSVCRTD' conflicts with use of other libs; use /NODEFAULTLIB:lib
rary
main.exe : fatal error LNK1169: one or more multiply defined symbols found
ADDED
The CppUnit provides older version of project file (dsw), so I needed to convert the file to 2010 solution project manually.
For the error, missing /MD for compilation was the source of the problem. For other compilation warning, I needed to add /EHsc parameter.
cl /EHsc /MD /c /I"./CppUnit/include" main.cpp testset.cpp complex.cpp
link /libpath:"CppUnit/lib" main.obj testset.obj complex.obj cppunit.lib /out:cpptest_static.exe
link /libpath:"CppUnit/lib" main.obj testset.obj complex.obj cppunit_dll.lib /out:cpptest_dynamic.exe
seems like you compiled CppUnit in debug mode, weheras you're now compiling your current files in release mode. Those should not be mixed, and that's what the compiler is telling you.
The quickest way to resolve this would probably be to use a VS project, and check it's settings against the project used to compile CppUnit.
on your edit: you're also mixing runtime libraries (eg check that both are compiled using the /MD switch aka Multi-Threaded DLL)
I upgraded my CPPUNIT projects to visual studio 2010 and had to manually fix it.
The problem in the build was in the final actions where the output files are copied.
For the cppunit_dll project, one of the custom commands is:
copy "$(TargetPath)" ..\..\lib\$(TargetName).dll
copy "$(TargetDir)$(TargetName).lib" ..\..\lib\$(TargetName).lib
$(TargetName) is "cppunit_dll".
This conflicts with what we're actually building: if you look at the Linker options, you see that the output file name is "cppunitd_dll.dll".
The solution I used is to go to ConfigurationPropertys\General, and change "Target Name" from $(ProjectName) to"cppunitd_dll".
I had to to a similar solution for the cppunit project.
read INSTALL-VS.Net2008.txt in the cppunit folder after checking out the source code from SVN.
basically:
there is a visual studio solution under the examples folder.
that being said... i still can't get it to build without errors on vs2010 after converting it. i get 'cmd.exe' failed and failures to copy dlls.