为什么我在使用其他库时遇到LNK4098冲突 – 尝试在MSVS2010 Express中编译C ++?

我的程序将不能在/ MT(multithreading)模式下成功编译。 它编译在/ MD(multithreadingDLL)。 我希望能够在一个应用程序中使用libcurl和boost,我将使用安装程序进行分发。

编译:MSVS2010

这是复制我的问题的代码:

#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; } 

这是我在/ MD模式下得到的警告:

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

如果我尝试编译/ MT模式,我得到:

 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 

我想在/ MT模式编译,以便其他人可以运行我已完成的程序与MSVS安装或需要下载任何额外的东西。 我可以在安装程序中包含我的应用程序所需的dll或lib文件。

我可以禁用加载“MSVCRTD”默认库,但随后编译与升压失败。

这些是我的预处理器定义:

 WIN32 _DEBUG _CONSOLE BUILDING_LIBCURL HTTP_ONLY 

这些是我的附加依赖项:

 libcurl.lib ws2_32.lib winmm.lib wldap32.lib 

有谁知道我在做什么错?

谢谢,威廉

尝试在VC中的链接器选项中设置nodefaultlib:libcmt.lib

MSVCRT * D * LIBC * MT * .lib

标志编译库不同于标志编译项目(/ MT,/ MTD,/ MD,/ MDD)

尝试从预编译器指令中删除_DEBUG (即构建发行版本)。 链接到应用程序的库使用非调试版本,代码链接到调试版本。 这就是为什么你得到链接器错误,符号被多重定义:它链接运行时库的调试和非调试版本。

(据我所知,你试图静态链接所有需要的库。)

尝试用rtlibcfg = static构建libCurl。 这将构建libCURL的/ Mt静态版本。