Uma tentativa para criar uma biblioteca de depuração que utiliza pré-compilados cabeçalhos poderão falhar e podem ser gerados erros de compilação fatal

Traduções de Artigos Traduções de Artigos
Artigo: 102697 - Ver produtos para os quais este artigo se aplica.
Este artigo foi arquivado. Este artigo é oferecido "tal como está" e deixará de ser actualizado.
Expandir tudo | Reduzir tudo

Nesta página

Sintomas

Uma tentativa para criar uma biblioteca de depuração que utiliza pré-compilados cabeçalhos poderão falhar e podem ser gerados erros de compilação fatal. Com 16-bit edition, os utilitários CVPACK e LINK podem gerar a seguinte mensagem de erro:
Erro fatal CVPACK: CK1017: não é possível localizar tipos de pré-compilados ficheiro; relink com file.obj
LINK: aviso LNK4027: erro CVPACK
Com a edição de 32 bits, o utilitário LINK pode gerar a seguinte mensagem de erro:
<filename>LINK: erro fatal LNK1211: pré-compilada informações de tipo não encontradas; "<nomeficheiro>" não ligado ou substituídos
Nota Se criar uma biblioteca estática numa versão do Visual Studio .NET com ficheiro de cabeçalho pré-compilado e utilizar a depuração de compilador muda /ZI ou /Zi, poderá não receber os erros listados neste artigo, mas poderá ver um dos seguintes dois problemas durante a depuração da aplicação e a tentar visualizar quaisquer variáveis da biblioteca na janela Watch:
  • Poderá receber a seguinte mensagem de erro na ver janela:
    CXX0033:Error:Error OMF tipo de informações
  • Ao expandir um objecto de classe, poderá ver entradas em branco apenas para os membros de classe.
A resolução para este problema depuração é igual ao descrito na secção "Resolução" deste artigo.

Causa

Quando especificar /Yc e / Z7 opções do compilador de linha de comandos Microsoft C/C ++ gera um ficheiro de cabeçalho pré-compilada com CodeView informações de depuração. O erro ocorre apenas quando armazenar o cabeçalho da pré-compilado numa biblioteca, utilize a biblioteca para criar um módulo de objecto e o código de origem não faz referência a qualquer uma das funções que define o ficheiro de cabeçalho pré-compilada.

Resolução

Existem dois métodos para contornar esta situação, da seguinte forma:
  • Especificar o parâmetro de opção do compilador /yd para adicionar informações CodeView do cabeçalho de pré-compilado para cada módulo de objecto. Este método é menos desejável porque produz geralmente módulos de objectos grandes podem aumentar o tempo necessário para ligar a aplicação.
  • Nota A trabalho-volta seguinte destina-se apenas versões de 32 bits. Especificar o /Yl<symbol> parâmetro de opção do compilador, onde <symbol> é o nome de um símbolo arbitrário na biblioteca, quando cria um ficheiro de cabeçalho pré-compilado que não contenha quaisquer definições de função. Este parâmetro indica o compilador para armazenar as informações de depuração no ficheiro de cabeçalho pré-compilada.

Ponto Da Situação

Este comportamento ocorre por predefinição.

Mais Informação

Quando compilar um módulo com /Yc e /Yl<symbol_name> parâmetros de opção utilizando a edição de 32 bits, o compilador cria um símbolo semelhante ao __@@_PchSym_@00 @... @ <symbol_name>, onde as reticências (...) representa um linker gerada cadeia de caracteres e guarda-o no módulo do objecto. Qualquer ficheiro de origem compilar com este cabeçalho pré-compilado refere-se para o símbolo especificado, o que faz com que linker incluir o módulo de objecto e respectivas informações de depuração da biblioteca.

O exemplo de código seguinte demonstra o problema.

Exemplo de código

   /*

    * To demonstrate this problem, perform the following five steps:
    *
    * 1. Compile TEST1.C as follows: cl /Yctest.h /Z7 /c TEST1.C
    * 2. Compile TEST2.C as follows: cl /Yutest.h /Z7 /c TEST2.C
    * 3. Build a library that contains TEST1.OBJ and TEST2.OBJ as
    *    follows: lib /out:test.lib test1.obj test2.obj
    * 4. Compile TEST3.C as follows: cl /Yutest.h /Z7 /c TEST3.C
    * 5. Link the application as follows:
    *       link /debugtype:cv /debug:notmapped,full test3.obj test.lib
    *
    * To correct this problem, do one of the following:
    *
    *   1. 32-bit only)  Compile TEST1.C in step 1 as follows:
    *        cl /Yctest.h /YlAnyName /Z7 /c TEST1.C
    *      Then, repeat step 2 through 5.
    *
    *   2. Repeat steps 1 through 5, adding the /Yd command line option
    *      to steps 1, 2, and 4.

    */ 
				

TEST.H

   #include <stdio.h>
				

TEST1.C

   #include "test.h"
				

TEST2.C

   #include "test.h"

   void test2func(void)
   {
      printf("inside TEST2FUNC...\n");
   }
				

TEST3.C

   #include "test.h"

   void test2func(void);

   void main(void)
   {
      printf("inside MAIN...\n");
   }
				

Propriedades

Artigo: 102697 - Última revisão: 1 de março de 2014 - Revisão: 5.1
A informação contida neste artigo aplica-se a:
  • Microsoft Visual C++ 1.0 Professional Edition
  • Microsoft Visual C++ 1.5 Professional Edition
  • Microsoft Visual C++ 1.51
  • Microsoft Visual C++ 1.52 Professional Edition
  • Microsoft Visual C++ 2.0 Professional Edition
  • Microsoft Visual C++ 2.1
  • Microsoft Visual C++ 2.2
  • Microsoft Visual C++ 4.1 Subscription
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • Microsoft Visual C++ .NET 2003 Standard Edition
  • Microsoft Visual C++ .NET 2002 Standard Edition
  • Microsoft Visual C++ 2005 Express Edition
Palavras-chave: 
kbnosurvey kbarchive kbmt kberrmsg kbtshoot kbcompiler kbprb KB102697 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 102697

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com