Pergunta

Em um novo aplicativo VCL Compilar e Construir A operação produz o mesmo arquivo binário e mapa (com pequenas diferenças no final do arquivo .exe, mesmo que "incluir informações da versão no projeto" a opção seja desligada - já discutida). O arquivo de mapa é o mesmo byte do byte. Mas, quando adiciono qualquer componente de terceiros que o arquivo binário e mapa (!) Produzido pela compilação e compilação são significativamente diferentes!

Testado em duas versões de Delphi:
- Versão 7.0 (construção 8.1)
- CodeGear ™ Rad Studio 2007 Versão 11.0.2902.10471 (Atualização de dezembro de 2007)

Passo para reproduzir:

  1. Crie um novo aplicativo VCL. Possivelmente adicione qualquer componente Delphi nativo (eu tento todos os componentes da guia Standart, Adicional, Win32 e System).
  2. Ligue o arquivo de mapa detalhado na guia Linker das opções do projeto.
  3. Projeto de construção.
  4. Renomeie o arquivo .exe e .map (por exemplo: Project1.exe para Project1b.exe e Project1.map para Project1b.map).
  5. Projeto de compilação.
  6. Renomeie o arquivo .exe e .map (por exemplo: Project1.exe para Project1C.EXE e Project1.map para Project1C.Map).
  7. Compare os arquivos da etapa 4 e 6. (eu uso o WinMerge 2.12.4.0).

Temos arquivos .exe pouco diferentes e arquivos .MAP totalmente idênticos. Então, se repetirmos todas as etapas novamente, mas usarmos no componente de terceiros do projeto (eu tento ODAC, DOA, EVEXPRESS e Auto-Made), obtemos mais arquivos .eexe e diferentes arquivos .MAP.

Por quê? Alguma sugestão?

ATUALIZAR
Algumas informações sobre como eu encontrei isso e por que me interessa:
O projeto é construído a partir de script simples com o msbuild. Quando no projeto foi adicionado tradução através da ITE (DLL com recursos), descobri que quando o Projeto foi construído (do script ou do IDE) - Versão traduzida trabalha errada - algum texto no botão, etiquetas etc. Obtenção do lugar errado (literalmente de outro botão, etiquetas). Quando o projeto compilou a partir do IDE - está tudo bem. Então eu começo a comparar a criação e a compilação de saída ...

Foi útil?

Solução

O que você está vendo é simplesmente um artefato da lógica embutida do compilador. Quando você faz uma compilação, ele diz ao compilador para criar todas as fontes disponíveis. Portanto, a Delphi processa cada arquivo de origem e para cada unidade nas listas de usos para as quais encontra a origem, ele criará esse arquivo. Isso faz isso recursivamente. Quando você faz uma compilação, apenas os arquivos .dcu existentes são carregados e, se eles estão atualizados, nada será feito. Isso pode realmente levar a uma ordem diferente na qual as unidades são descobertas, pois cada .dcu efetivamente "achatará" a lista de usos. Como as unidades são descobertas e carregadas em uma ordem diferente, elas estão dentro, vinculadas em uma ordem diferente. É por isso que seus arquivos de mapa parecem tão diferentes. Dadas as mesmas fontes, o arquivo de mapa deve ser o mesmo se você fizer duas compilações em uma linha ou duas compiladas em uma linha.

Outras causas para diferenças são mais mundanas e incluem coisas como o carimbo de hora do cabeçalho do PE e outros pedaços de preenchimento e alinhamentos.

Outras dicas

Acredito que há duas partes nesta resposta.

Parte do problema que você está vendo, IIRC, é que o compilador não zero da memória antes de fazer uma compilação/construção. Assim, qualquer coisa deixada na memória não inicializada se torna preenchimento na saída para fins de alinhamento.

Parece que também me lembro que há um carimbo de data para data incluído nas informações do cabeçalho do PE para o aplicativo. Isso causará uma diferença toda vez.

Não sou a melhor pessoa para confirmar isso, mas é isso que me lembro das discussões anteriores.

Pessoas como Allen Bauer ou Barry Kelly provavelmente poderiam fornecer informações melhores/mais precisas sobre isso.

Se você usar o Compiler Define em seu projeto e apenas alterá -los, se você fizer uma compilação, não verá nenhuma alteração nos DCUs e no módulo resultante (exe ou dll). Se você fizer uma reconstrução completa, o compilador define é usado nos DCU e módulos recém -criados.

Eu vi isso em um grande grupo de projetos, onde usamos módulos em projetos diferentes com defines diferentes e todos os DCUs são armazenados no mesmo diretório.

Ergo: O compilador não aplica as dependências das define neste caso.

Talvez você tenha visto o mesmo problema.

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