Почему я получаю конфликты LNK4098 при использовании других библиотек — при попытке скомпилировать C в MSVS2010 Express?

#c #windows #linker #installation #visual-studio

#c #Windows #компоновщик #установка #visual-studio

Вопрос:

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

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

Спасибо, Уильям

Ответ №1:

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

Комментарии:

1. Теперь он компилируется, но когда я пытаюсь запустить его на компьютере без MSV, я получаю MSVCP100d.dll не найдено. Какие файлы мне нужно включить в установку, чтобы моя программа не требовала от пользователя загрузки каких-либо дополнительных файлов?

2. ^ Я решил проблему с не найденными DLL, включив их в установку.

3. Добавление конкретных инструкций было бы простым способом сделать этот пост более полезным.

4. msvcp100 [d].dll не должна распространяться вместе с программой. Обратите внимание на «d» в конце, отмечая версию «debug». У большинства пользователей не будет отладочных версий. 100 означает MSVC runtimes 10 (с 2010; 110 — iirc 2012). Вам нужно будет скомпилировать в release и потребовать среды выполнения Visual C для 2010, чтобы запустить приложение.

Ответ №2:

MSVCRT * D* LIBC * MT*.lib

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

Ответ №3:

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

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

Ответ №4:

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