Почему я получаю конфликт LNK4098 с использованием других библиотек - при попытке компилировать C ++ в MSVS2010 Express? - PullRequest
5 голосов
/ 30 апреля 2011

Моя программа не будет успешно скомпилирована в режиме / 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', но тогда компиляция с boost не удалась.

Это мои определения препроцессора:

WIN32
_DEBUG
_CONSOLE
BUILDING_LIBCURL
HTTP_ONLY

Это мои дополнительные зависимости:

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

Кто-нибудь знает, что я делаю не так?

Спасибо, William

Ответы [ 4 ]

7 голосов
/ 30 апреля 2011

Попробуйте установить nodefaultlib:libcmt.lib в настройках компоновщика в VC.

3 голосов
/ 30 апреля 2011

MSVCRT * D * LIBC * MT *. Lib

Флаг компиляции библиотеки отличается от флага компиляции проекта (/ MT, / MTD, /MD, / MDD)

1 голос
/ 02 мая 2011

Попробуйте удалить _DEBUG из директив прекомпилятора (т. Е. Выпустить версию сборки).Библиотеки, на которые вы ссылаетесь в своем приложении, используют не отладочные версии, а ваш код ссылается на debug-версию.Вот почему вы получаете ошибку компоновщика из-за того, что символы многократно определены: он связывает как отладочные, так и не отладочные версии библиотек времени выполнения.

(насколько я понял, вы пытались статически связать все необходимые библиотеки.)

0 голосов
/ 01 декабря 2014

Попробуйте собрать libCurl с помощью rtlibcfg = static. Это создаст / Mt статическую версию libCURL.

...