为什么我在尝试在MSVS2010 Express中编译C ++时会因使用其他库而导致LNK4098冲突?

时间:2011-04-30 03:50:15

标签: c++ windows linker installer visual-studio

我的程序无法在/ MT(MultiThreaded)模式下成功编译。它在/ MD(MultiThreaded DLL)中编译。我希望能够在我将使用安装程序分发的应用程序中同时使用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'默认库,但是然后编译with boost会失败。

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

WIN32
_DEBUG
_CONSOLE
BUILDING_LIBCURL
HTTP_ONLY

这些是我的附加依赖项:

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

有谁知道我做错了什么?

谢谢, 威廉

4 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:3)

MSVCRT * d * LIBC * MT *。lib中

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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