为什么我得到LNK4098冲突与使用其他库-当试图编译c++在MSVS2010 Express
Why do I get LNK4098 conflicts with use of other libs - when trying to compile C++ in MSVS2010 Express?
我的程序在/MT(多线程)模式下无法成功编译。它在/MD(多线程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'默认库,但随后编译与boost失败。
这些是我的预处理器定义:
WIN32
_DEBUG
_CONSOLE
BUILDING_LIBCURL
HTTP_ONLY
这些是我额外的依赖项:
libcurl.lib
ws2_32.lib
winmm.lib
wldap32.lib
有人知道我做错了什么吗?
谢谢,威廉。
尝试在VC中的链接器选项中设置nodefaultlib:libcmt.lib
MSVCRT*D*LIBC * 太* . lib
标志编译库不同于标志编译项目(/MT,/MTD,/MD,/MDD)
尝试从预编译器指令(即构建发布版本)中删除_DEBUG
。链接到应用程序中的库使用非调试版本,而代码链接到调试版本。这就是为什么你会得到多重定义符号的链接器错误:它链接了调试和非调试版本的运行时库。
(据我所知,您试图静态链接所有所需的库)
尝试使用rtlibcfg=static构建libCurl。这将构建libCURL的/Mt静态版本。