#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.