Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Инструменты разработчика _ Компиляция в Visual Studio с ключом /MT

Автор: AD 3.2.2009, 11:37

При компиляции dll использую ключ /MT (Runtime library: Multi-threaded).

При линковании возникают подобные ошибки:
Linking...
MSVCRT.lib(MSVCR80.dll) : error LNK2005: _malloc already defined in LIBCMT.lib(malloc.obj)
MSVCRT.lib(MSVCR80.dll) : error LNK2005: _free already defined in LIBCMT.lib(free.obj)
MSVCRT.lib(MSVCR80.dll) : error LNK2005: _realloc already defined in LIBCMT.lib(realloc.obj)
MSVCRT.lib(MSVCR80.dll) : error LNK2005: _exit already defined in LIBCMT.lib(crt0dat.obj)
MSVCRT.lib(MSVCR80.dll) : error LNK2005: _fflush already defined in LIBCMT.lib(fflush.obj)
MSVCRT.lib(MSVCR80.dll) : error LNK2005: _getenv already defined in LIBCMT.lib(getenv.obj)
MSVCRT.lib(MSVCR80.dll) : error LNK2005: _memmove already defined in LIBCMT.lib(memmove.obj)
MSVCRT.lib(MSVCR80.dll) : error LNK2005: __errno already defined in LIBCMT.lib(dosmap.obj)
MSVCRT.lib(MSVCR80.dll) : error LNK2005: _strncmp already defined in LIBCMT.lib(strncmp.obj)
MSVCRT.lib(MSVCR80.dll) : error LNK2005: _isspace already defined in LIBCMT.lib(_ctype.obj)
MSVCRT.lib(MSVCR80.dll) : error LNK2005: _isalnum already defined in LIBCMT.lib(_ctype.obj)
MSVCRT.lib(MSVCR80.dll) : error LNK2005: _tolower already defined in LIBCMT.lib(tolower.obj)
MSVCRT.lib(MSVCR80.dll) : error LNK2005: _strchr already defined in LIBCMT.lib(strchr.obj)
MSVCRT.lib(MSVCR80.dll) : error LNK2005: __tzset already defined in LIBCMT.lib(tzset.obj)
MSVCRT.lib(MSVCR80.dll) : error LNK2005: _isupper already defined in LIBCMT.lib(_ctype.obj)
MSVCRT.lib(MSVCR80.dll) : error LNK2005: _isalpha already defined in LIBCMT.lib(_ctype.obj)
MSVCRT.lib(MSVCR80.dll) : error LNK2005: _isdigit already defined in LIBCMT.lib(_ctype.obj)
MSVCRT.lib(MSVCR80.dll) : error LNK2005: __control87 already defined in LIBCMT.lib(ieee87.obj)
MSVCRT.lib(MSVCR80.dll) : error LNK2005: __clearfp already defined in LIBCMT.lib(ieee87.obj)
MSVCRT.lib(MSVCR80.dll) : error LNK2005: __close already defined in LIBCMT.lib(close.obj)
MSVCRT.lib(MSVCR80.dll) : error LNK2005: _fclose already defined in LIBCMT.lib(fclose.obj)
MSVCRT.lib(MSVCR80.dll) : error LNK2005: __lseeki64 already defined in LIBCMT.lib(lseeki64.obj)
MSVCRT.lib(MSVCR80.dll) : error LNK2005: __write already defined in LIBCMT.lib(write.obj)
MSVCRT.lib(MSVCR80.dll) : error LNK2005: __get_osfhandle already defined in LIBCMT.lib(osfinfo.obj)
MSVCRT.lib(MSVCR80.dll) : error LNK2005: __open_osfhandle already defined in LIBCMT.lib(osfinfo.obj)
MSVCRT.lib(MSVCR80.dll) : error LNK2005: _wcslen already defined in LIBCMT.lib(wcslen.obj)
MSVCRT.lib(MSVCR80.dll) : error LNK2005: _strrchr already defined in LIBCMT.lib(strrchr.obj)
MSVCRT.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) already defined in LIBCMT.lib(typinfo.obj)
MSVCRT.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) already defined in LIBCMT.lib(typinfo.obj)
   Creating library ..\..\Bin\Release\KeyGenerationBlock\KeyGenerationBlock_s.lib and object ..\..\Bin\Release\KeyGenerationBlock\KeyGenerationBlock_s.exp
LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library
..\..\Bin\Release\KeyGenerationBlock\KeyGenerationBlock_s.dll : fatal error LNK1169: one or more multiply defined symbols found
Results
         
Build log was saved at "file://d:\Projects\Win32\Obj\Release\KeyGenerationBlock\BuildLog.htm"
KeyGenerationBlock_s - 30 error(s), 1 warning(s)

Как отключить ненужный уже MSVCRT? Заранее благодарен.

Автор: Litkevich Yuriy 3.2.2009, 12:29

а ты на QtCentre все про это дело прочитал, ни чего не упустил?

Автор: AD 3.2.2009, 12:33

Цитата(Litkevich Yuriy @ 3.2.2009, 12:29) *
а ты на QtCentre все про это дело прочитал, ни чего не упустил?

Ты про что? :) При чем здесь вообще Qt? Если ты про сборку Qt, то при сборке я все аккуратненько сделал. Сборка завершилась удачно. Но она в данных ошибках не при чем! :)

Автор: Litkevich Yuriy 3.2.2009, 12:59

Цитата(AD @ 3.2.2009, 15:33) *
При чем здесь вообще Qt?
хех, я не обратил внимание на название форума. :)

Автор: AD 3.2.2009, 13:37

Нашел решение проблемы. При установке ключа /MT также следует сделать следующее:
В свойствах проекта, вкладке C/C++ в подвкладке Advanced установить флаг /Zl (Omit Default Library Names).
Все ошибки сразу же пропадут.

Но есть тогда такой вопрос: как полностью избавиться от зависимости от MSVCR80.dll? Установка указанных ключей избавило от MSVCP80.dll, что еще надо поставить, чтобы и эту dll вовнутрь спрятать? :)

Автор: Litkevich Yuriy 3.2.2009, 13:58

AD, прочитай в http://prog.org.ru/wiki/index.php?title=%D0%A1%D0%B1%D0%BE%D1%80%D0%BA%D0%B0_Qt_%D0%B1%D0%B5%D0%B7_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B5%D0%B9_%28MS_Visual_Studio%29 статью, может, что-то найдешь, она отличается от той, что на QtCentre, вроде как универсальностью

Хоть она и ориентирована на Qt, но может ты, как пользователь студии, что-то заметишь.

Автор: AD 3.2.2009, 14:16

Цитата(Litkevich Yuriy @ 3.2.2009, 13:58) *
AD, прочитай в http://prog.org.ru/wiki/index.php?title=%D0%A1%D0%B1%D0%BE%D1%80%D0%BA%D0%B0_Qt_%D0%B1%D0%B5%D0%B7_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B5%D0%B9_%28MS_Visual_Studio%29 статью, может, что-то найдешь, она отличается от той, что на QtCentre, вроде как универсальностью

Хоть она и ориентирована на Qt, но может ты, как пользователь студии, что-то заметишь.

Так именно по этой статье я и делал статическую сборку (ведь именно на нее ты ссылку и давал)! ;) Но опять же к данной теме не имеет отношения. Там в файлах заметить нужный флаг - это мазохизм....

Автор: AD 4.2.2009, 11:28

Кто-нибудь, помогите, пожалуйста, очень нужно!!!

Автор: kuler 4.2.2009, 11:34

Цитата(AD @ 3.2.2009, 13:37) *
Но есть тогда такой вопрос: как полностью избавиться от зависимости от MSVCR80.dll?

Не уверен в своем ответе, но тем не менее выскажусь - видимо нужно найти MSVCR80.lib.

Автор: AD 4.2.2009, 17:09

Цитата(kuler @ 4.2.2009, 11:34) *
Не уверен в своем ответе, но тем не менее выскажусь - видимо нужно найти MSVCR80.lib.

Таковой вообще нет! :mellow:

Автор: kuler 4.2.2009, 17:46

Цитата(AD @ 4.2.2009, 17:09) *
аковой вообще нет!

где нет? в мире она наверно есть. А в честь чего она вообще используется? обычно нужные либы подрубаются путем настройки в свойствах проекта linker->input.

Автор: AD 4.2.2009, 18:01

Цитата(kuler @ 4.2.2009, 17:46) *
где нет? в мире она наверно есть. А в честь чего она вообще используется? обычно нужные либы подрубаются путем настройки в свойствах проекта linker->input.


Где подрубается, я знаю! :) Но в Visual Studio ее нет впринципе. Может по другому называется? <_<

Автор: kuler 4.2.2009, 18:52

а зачем ее отрубать?

и в linker->input есть inherit values может с ними чо поделать?

Автор: AD 4.2.2009, 19:12

Цитата(kuler @ 4.2.2009, 18:52) *
а зачем ее отрубать?

и в linker->input есть inherit values может с ними чо поделать?

:blink: я твоя не понимать....
Мне необходимо узнать какой флажок нужно установить. Напрямую (т.е. ручками) эту библиотеку, msvcrt.lib, подключать не следует - будут ошибки и много. А вот каким флагом это регулируется?

Автор: kuler 5.2.2009, 10:38

вообще поиск в гугле выявил схожие проблемы, но вроде решения я не нарыл

Автор: kalombo 5.2.2009, 17:54

Не знаю как начать, поэтому опишу всё, что я сделал=). Хотел я, чтобы собранные в MSVS Qt-приложения зависели только от Qt-шных библиотек, наткнулся на этот топик, а в нём на ссылку на ПрогОрг. Сделал по статье, зависимость осталась, но только от одной библиотеки - MSVCR90.dll. Погуглил, нашел такое решение
Project Property->Configuration properties->c/c++->code generation->runtime library->MT
Project Property->Linking->Manifest File->Generating Manifest->NO
Только размер приложения увеличился на 40 килобайт. Но думаю это пустяки=) Буду рад, если мой пост кому-то поможет.

Автор: Litkevich Yuriy 5.2.2009, 18:17

Цитата(kalombo @ 5.2.2009, 20:54) *
а в нём на ссылку на ПрогОрг.
у них еще http://www.prog.org.ru/topic_8435_0.html было.

Автор: AD 5.2.2009, 18:58

Забавно у кое-кого получилось. :)
Вопрос: что еще следует указать помимо флага /MT, для того, чтобы не было зависимости от MSVRT*.dll
Ответ: надо указать флаг /MT!

Большое человеческое спасибо! :D

* - версия Visual Studio

Юра, обсуждение было лишь к тому, как лучше отключить манифесты. Один вариант - просто убрать из строки подключения. Второй вариант - подгружать манифест только в том случае, если в настройках проекта пользователь НЕ ЗАПРЕТИЛ его подгружать.

Автор: kuler 13.3.2009, 11:21

кстати зависимость может быть изза того что сама qt так собрана - с ней.

Автор: AD 13.3.2009, 11:32

Цитата(kuler @ 13.3.2009, 11:21) *
кстати зависимость может быть изза того что сама qt так собрана - с ней.

Вроде как отключил эту зависимость и пересобрал Qt.

Автор: kuler 13.3.2009, 12:37

Цитата(AD @ 13.3.2009, 11:32) *
Вроде как отключил эту зависимость и пересобрал Qt

а она у тебя не так зависит?

 

Автор: AD 13.3.2009, 12:57

Цитата(kuler @ 13.3.2009, 12:37) *
а она у тебя не так зависит?

Неа, не так.
[attachment=487:zavisimost.JPG]

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)