windows - Hvorfor får jeg LNK4098 konflikter med brug af andre libs - når jeg forsøger at kompilere C ++ i MSVS2010 Express?

Indlæg af Hanne Mølgaard Plasc

Problem



Mit program kan ikke kompilere i/MT (MultiThreaded). Det kompilerer i/MD (MultiThreaded DLL). Jeg vil gerne kunne bruge både libcurl og boost i en applikation, jeg vil distribuere med et installationsprogram.


Kompilere i: MSVS2010


Dette er kode for at replikere mit problem:


#include "stdafx.h"
#include "boost/regex.hpp"
#include "curl/curl.h"

int \_tmain(int argc, \_TCHAR* argv[])
{
    CURL *curl;  
    curl = curl\_easy\_init();  
    return 0;
}


Dette er den advarsel, jeg får, hvis i/MD-tilstand:


LINK : warning LNK4098: defaultlib 'MSVCRTD' conflicts with use of other libs; 
use /NODEFAULTLIB:library


Hvis jeg forsøger at kompilere i/MT-tilstand, får jeg:


1>MSVCRTD.lib(MSVCR100D.dll) : error LNK2005: \_calloc already defined in 

LIBCMT.lib(calloc.obj)
1>MSVCRTD.lib(MSVCR100D.dll) : error LNK2005: \_realloc already defined in LIBCMT.lib(realloc.obj)
1>MSVCRTD.lib(MSVCR100D.dll) : error LNK2005: \_free already defined in LIBCMT.lib(free.obj)
1>MSVCRTD.lib(MSVCR100D.dll) : error LNK2005: \_malloc already defined in LIBCMT.lib(malloc.obj)
1>MSVCRTD.lib(MSVCR100D.dll) : error LNK2005: \_strtoul already defined in LIBCMT.lib(strtol.obj)
1>MSVCRTD.lib(MSVCR100D.dll) : error LNK2005: \_memmove already defined in LIBCMT.lib(memmove.obj)
1>MSVCRTD.lib(MSVCR100D.dll) : error LNK2005: \_tolower already defined in LIBCMT.lib(tolower.obj)
1>MSVCRTD.lib(MSVCR100D.dll) : error LNK2005: \_strtol already defined in LIBCMT.lib(strtol.obj)
...
: fatal error LNK1169: one or more multiply defined symbols found


Jeg vil kompilere i/MT mode, så andre kan køre mit færdige program uden at have MSVS installeret eller behøver at downloade noget ekstra. Jeg kan inkludere og dll- eller lib-filer, der er brug for af min app i installationsprogrammet.


Jeg kunne deaktivere indlæsning af 'MSVCRTD' standardbiblioteket, men kompilering af med boostet mislykkes.


Dette er mine præprocessor definitioner:


WIN32
\_DEBUG
\_CONSOLE
BUILDING\_LIBCURL
HTTP\_ONLY


Dette er mine yderligere afhængigheder:


libcurl.lib
ws2\_32.lib
winmm.lib
wldap32.lib


Ved der nogen, hvad jeg gør galt?


Tak,
William

Bedste reference


Prøv at indstille nodefaultlib:libcmt.lib i linker muligheder i VC.

Andre referencer 1


MSVCRT * D *
LIBC * MT *. Lib


flag kompilere biblioteket adskiller sig fra flagmet kompilere projektet (/MT,/MTD,/MD,/MDD)

Andre referencer 2


Prøv at fjerne \_DEBUG fra precompiler-direktiver (dvs. build release version). De biblioteker, du linker til din ansøgning, bruger en ikke-debug-version og din kodeforbindelse til debug-version. Det er derfor, du får linkerfejl, at symboler er multipliceret defineret: det forbinder både debug og non-debug versioner af runtime biblioteker.


(Så vidt jeg forstod, forsøgte du statisk at forbinde alle de nødvendige biblioteker.)

Andre referencer 3


Prøv at opbygge libCurl med rtlibcfg=static. Dette vil opbygge den/Mt statiske version af libCURL.