Приложение VS 2010 требует установки VS runtime - как этого избежать? - PullRequest
0 голосов
/ 05 сентября 2010

Я написал приложение в VS C ++ 2010 Express Edition, которое состоит из нескольких библиотек DLL, а также зависит от некоторых сторонних библиотек DLL.Само приложение является библиотекой DLL.

Как оказалось, для того, чтобы оно работало на другом компьютере, пользователь должен установить распространяемую среду выполнения VS 2010.

Я пытался собрать свою DLL с флагом / MT вместо / MD - я считаю, что это означает, что я хочу статическое связывание. Однако в этом случае я получил ошибки «множественного определения» о MSCVRT.lib.Сообщение об ошибке также предлагает использовать флаг /NODEFAULTLIB:msvcrt.lib, чтобы избежать этого.Однако с этими настройками мое приложение все еще требует установки во время выполнения.

Может кто-нибудь объяснить мне, как этого избежать?

Спасибо, Робуста

Обновление: если я просто использую флаг / MT вместо / MD, я получаю следующую ошибку

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 C:\MyApp\Release\MyApp.lib and object C:\MyApp\Release\MyApp.exp LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library C:\MyApp\Release\MyApp.dll : fatal error LNK1169: one or more multiply defined symbols found

после добавления флага / NODEFAULTLIB: библиотека Я не получаю ошибок, приложение собрано успешно, но все еще требует установки во время выполнения.

Возможно, что сторонние библиотеки, на который я тоже ссылку, требую время выполнения?

1 Ответ

3 голосов
/ 05 сентября 2010

Вы ссылаетесь на некоторый код, который все еще скомпилирован с / MD, возможно, какая-то статическая библиотека. Микширование и сопоставление не работает.

Использование / MT при использовании DLL очень опасно. У вас возникнут проблемы, когда экспортированные функции вернут указатель или объект C ++, который должен быть освобожден клиентским кодом. Возврат std :: string например. С / MT клиент будет использовать свой собственный распределитель кучи для освобождения памяти. Не может работать, DLL использовала другую кучу. Вы будете течь, очень трудно диагностировать. Использование сторонних библиотек DLL, созданных с использованием другой версии CRT, является проблемой по той же причине. В этой статье MSDN Library есть больше подробностей .

Развертывание необходимых библиотек CRT довольно просто с этой загрузкой .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...