Pergunta

Quando do desenvolvimento e implantação de aplicativos nativos do Windows, muitas vezes precisa para instalar o tempo de execução antes de ser capaz de executar o meu binário, ou estaticamente a biblioteca de vínculo com a minha binário.Por exemplo, após a construção de um "Win32 Console", um projeto do Visual Studio 2008, tentar executar o programa em uma nova imagem do Windows 7 resultados em:

O aplicativo falhou ao iniciar porque o seu side-by-side de configuração está incorreta.Consulte o log de eventos do aplicativo ou use a linha de comando sxstrace.exe ferramenta para obter mais detalhes.

Problemas como este ter sido criado na outros posts no StackOverflow.

Como desenvolver aplicativos que não requerem tempos de execução que não estão já no sistema operacional de destino (por exemplo,não exige a instalação de pacotes redistribuíveis ou privado/shared side-by-side assemblies)?Como se faz para evitar o uso de msvc[mpr]90.dll e apenas utilizar a API do Windows em \windows\system32*.{dll,sys}?

Eu estou pensando ao longo das linhas de código que vem de fora da demoscene, mas que freqüentemente não estão disponíveis.

Foi útil?

Solução

Outros já responderam com relação à ligação estaticamente do CRT. Se você também deseja um pequeno binário ao mesmo tempo, sua melhor aposta é completamente o CRT e use apenas as funções da API Win32 o máximo possível. Você ainda receberá algum código CRT, principalmente relacionado à inicialização (ou seja, o que chama main) e desligamento (atexit manusear etc), mas, caso contrário, o vinculador não vinculará as funções CRT que você não usa.

Você pode evitar vincular o CRT completamente usando /Zl Switch do compilador. Isso significa que main Não vai mais funcionar, no entanto - você precisará definir WinMain (o nome não importa, mas a assinatura deve corresponder, e deve ser __stdcall), e você terá que especificar o nome do seu WinMain-Função como um ponto de entrada via vinculador /entry: trocar. Isso economizará ~ 30kb de código CRT (testado em um .cpp com um vazio main).

Se você seguir a última rota, também pode ter que lidar com a questão da Intrinsics do compilador. Existem algumas funções que são definidas nominalmente pelo CRT (e declaradas em seus cabeçalhos), mas que são tratados especialmente pelo compilador, para que ele insira instruções de montagem otimizadas no ponto da chamada sempre que possível - exemplos são memset, strlen, e um bom pedaço de funções em <math.h>; Uma lista completa pode ser encontrada aqui. Como você não tem CRT, se precisar dessas funções, ou pode evitá -lo, mas prefere o intrínseco por causa do melhor desempenho (difícil de fazer melhor do que memset, por exemplo), então você deve declará -los você mesmo e usar #pragma intrinsic. Por exemplo:

// Contains macros and typedef only, so safe to include without CRT.
// We need it here for size_t.
#include <stddef.h> 

extern "C"
{
    int abs(int);
    void* memset(void*, int, size_t); 
}

#pragma intrinsic(abs, memset)

int __stdcall main(void*, void*, char*, int)
{
    char tmp[10];
    memset(tmp, abs(-123), 10);
    return 0;
}

O acima pode ser compilado com:

cl /c /Zl foo.cpp
link /entry:main foo.obj

Outras dicas

Link CRT estaticamente através da /MT switch (e, da mesma forma MFC, se você está usando-o).

A vinculação estática limita o que você pode fazer com DLLs um pouco, mas para executáveis simples, ele funciona como um encanto.(E se você estiver enviando DLLs, você sempre pode navio conjuntos particulares de qualquer maneira.)

Use o CRT estático. Isso não cria uma dependência do MSVC*.dll. O CRT está vinculado diretamente ao seu programa. Isso não cria dependências, mas aumenta o tamanho do seu executável.

Mais informações sobre diferentes opções de CRT aqui.

Vincular estaticamente o tempo de execução. MS Visual C ++ tem opção /mt para isso (padrão é /md)

Eu acho que uma maneira de fazer isso é simplesmente não usar o Visual Studio e, em vez disso, confiar nas ferramentas SDK da linha de comando. (Você pode descobrir como configurar vs para fazer o que quiser, mas isso parece mais difícil.) Por exemplo:

cl /c app.cpp
link app.obj ws2_32.lib
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top