Ошибки при использовании многопоточных библиотек времени выполнения с icc 14

Когда я использую флаг /MT с ICC 14, я получаю следующие ошибки:

1>  xilink: executing 'link'
1>MSVCRT.lib(MSVCR120.dll) : error LNK2005: isspace already defined in LIBCMT.lib(_ctype.obj)
1>MSVCRT.lib(MSVCR120.dll) : error LNK2005: __iob_func already defined in LIBCMT.lib(_file.obj)
1>MSVCRT.lib(MSVCR120.dll) : error LNK2005: fprintf already defined in LIBCMT.lib(fprintf.obj)
1>MSVCRT.lib(MSVCR120.dll) : error LNK2005: abort already defined in LIBCMT.lib(abort.obj)
1>MSVCRT.lib(MSVCR120.dll) : error LNK2005: free already defined in LIBCMT.lib(free.obj)
1>MSVCRT.lib(MSVCR120.dll) : error LNK2005: malloc already defined in LIBCMT.lib(malloc.obj)
1>MSVCRT.lib(MSVCR120.dll) : error LNK2005: realloc already defined in LIBCMT.lib(realloc.obj)
1>MSVCRT.lib(ti_inst.obj) : error LNK2005: "private: __cdecl type_info::type_info(class type_info const &)" (??0type_info@@AEAA@AEBV0@@Z) already defined in LIBCMT.lib(typinfo.obj)
1>MSVCRT.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __cdecl type_info::operator=(class type_info const &)" (??4type_info@@AEAAAEAV0@AEBV0@@Z) already defined in LIBCMT.lib(typinfo.obj)
1>LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library
1>D:\forgottenserver-master\vc12\x64\Release\theforgottenserver.exe : fatal error LNK1169: one or more multiply defined symbols found

Я понятия не имею, что вызывает это, и когда я использую флаг /MD, все работает нормально.

Я использую ICC версии 14 с MSVC 2013 Ultimate и компилирую программу для x64 с повышением (я сам скомпилировал эти файлы для платформы iw, и они работают)


person dominique120    schedule 28.06.2014    source источник
comment
Как насчет use /nodefaultlib:MSVCRT?   -  person Jonas Bötel    schedule 29.06.2014
comment
@LumpN Это решило проблему   -  person dominique120    schedule 29.06.2014
comment
Вам не нужно указывать /nodefaultlib:msvcrt. Если вы получаете описанные вами ошибки, это означает, что некоторые объекты в вашем компоновщике были скомпилированы с помощью /MT, а другие — с /MD. Вы не можете смешивать и сочетать; все исходные файлы должны быть скомпилированы с одной и той же опцией.   -  person James McNellis    schedule 29.06.2014
comment
@JamesMcNellis Как скомпилировать библиотеки, указанные в ошибке с флагом /MT?   -  person dominique120    schedule 29.06.2014


Ответы (1)


Попробуйте указать LIBCMT в свойствах -> компоновщик -> игнорировать определенные библиотеки по умолчанию

person grisha    schedule 28.06.2014
comment
Исправление ошибок многократно определенных символов путем их игнорирования никогда не является хорошей идеей. Смешение сред выполнения вполне может привести к незаметным и трудно диагностируемым ошибкам памяти. - person Sneftel; 29.06.2014
comment
Я сказал, попробуй, а не ты должен - person grisha; 29.06.2014
comment
Если он попытается, это сработает. Затем через некоторое время у него произойдет сбой, когда он попытается изменить размер вектора, и он понятия не имеет, почему. - person Sneftel; 29.06.2014
comment
это называется опыт :) - person grisha; 29.06.2014
comment
Значит, ваш план состоит в том, чтобы умышленно ввести его в заблуждение, чтобы он изо всех сил пытался понять, что вы намеренно вводили его в заблуждение, а не просто учить его тому, что ему нужно знать? Это... я даже не знаю. - person Sneftel; 29.06.2014
comment
вы решили, что мое предложение на 100% неверно и что это должно привести к неизвестным ошибкам и так далее. Но это неправда. Это может привести к таким ошибкам, а может и не привести. Я не говорю, что вы не правы. А надо было просто предупредить о возможности появления труднодиагностируемых багов памяти. И ты ошибаешься насчет моего плана. Я просто говорю о возможном решении. И теперь, если он попробует и у него будут странные ошибки, то он будет знать, что, может быть, это было вызвано таким решением. Кстати, это работает. Жду ваших ошибок :) - person grisha; 29.06.2014