为什么我得到LNK4098冲突与使用其他库-当试图编译c++在MSVS2010 Express

Why do I get LNK4098 conflicts with use of other libs - when trying to compile C++ in MSVS2010 Express?

本文关键字:编译 c++ Express MSVS2010 其他 LNK4098 冲突 为什么      更新时间:2023-10-16

我的程序在/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静态版本。