Como alguns aplicativos podem simplesmente ser descompactados e executados em PCs com Windows sem problemas de SxS?

StackOverflow https://stackoverflow.com/questions/6031066

Pergunta

É uma reclamação comum de certos grupos que a instalação no Windows espalha coisas por todo o sistema de arquivos e registro, e alguns aplicativos oferecem a opção de simplesmente descompactar os arquivos para que você possa ‘desinstalar’ apenas excluindo.Mas como eles evitam toda a feiúra do Visual C++ Redist, Side-by-Side (SxS), etc?

Eu tenho um pequeno utilitário e realmente prefiro distribuir apenas um único .EXE que seja executado - nenhum instalador ou mesmo descompactado, pois é pequeno.Isso é viável?

editar:Conforme sugerido, tentei construir com dependência estática em tempos de execução (/MT em vez de/MD).Recebi o seguinte (parte do meio truncada para maior clareza):

1>Linking...
1>MSVCRT.lib(MSVCR90.dll) : error LNK2005: _free already defined in LIBCMT.lib(free.obj)
1>MSVCRT.lib(MSVCR90.dll) : error LNK2005: _malloc already defined in LIBCMT.lib(malloc.obj)
1>MSVCRT.lib(MSVCR90.dll) : error LNK2005: __mbschr already defined in LIBCMT.lib(mbschr.obj)
1>MSVCRT.lib(MSVCR90.dll) : error LNK2005: _realloc already defined in LIBCMT.lib(realloc.obj)
1>MSVCRT.lib(MSVCR90.dll) : error LNK2005: __strdup already defined in LIBCMT.lib(strdup.obj)
1>MSVCRT.lib(MSVCR90.dll) : error LNK2005: _abort already defined in LIBCMT.lib(abort.obj)
1>MSVCRT.lib(MSVCR90.dll) : error LNK2005: __stricmp already defined in LIBCMT.lib(stricmp.obj)
1>MSVCRT.lib(MSVCR90.dll) : error LNK2005: _setlocale already defined in LIBCMT.lib(setlocal.obj)
1>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)
1>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)
1>LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library
Foi útil?

Solução

Você pode distribuir um único EXE se vincular estaticamente ao tempo de execução do VC - na página de propriedades do projeto -> Propriedades de configuração -> C/C++ -> Geração de código e definir "Biblioteca de tempo de execução" como uma opção "não dll".

Dependendo do seu público-alvo, a distribuição como .exe pode ser problemática, pois o download de arquivos .exe às vezes é bloqueado em ambientes corporativos, portanto, é aconselhável fornecer também um arquivo .zip.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top