Visual C ++: Como desabilitar avisos de vinculador específicos?

118

Estou usando uma biblioteca CGAL que, durante o estágio de vinculação de minha compilação de código, produz muitos avisos de vinculação neste formato:

warning LNK4099: PDB 'vc80.pdb' was not found with 'gmp-vc80-mt-sgd.lib' or at 'vc80.pdb'; linking object as if no debug info

Como eu desativo este aviso de vinculador específico em Visual C ++ / Studio 2008?

Observe que não tenho nenhum controle sobre a biblioteca externa (CGAL) que estou usando. Não posso / não quero recompilar a biblioteca externa. Daí a necessidade de consertar as mensagens do meu lado.

Ashwin Nanjappa
fonte
1
Para VS2005 / ignore: 4099 funciona bem.
/ ignore: 4099 funciona bem aqui com VS2008.
Tom,
/ignore:4099funciona bem no Visual Studio 10 com C ++. Recebi o aviso LNK4099: PDB 'vc100.pdb' was not found with 'gtest_main-mdd.lib(gtest_main.obj)e consegui removê-lo dessa forma.
Manolete
Veja também: Não é possível desativar o 'aviso LNK4099'
Daniel Trebbien
3
VS2013 aceita / ignora: 4099 muito bem :)
mlvljr

Respostas:

101

Adicione o seguinte como uma opção de vinculador adicional:

 /ignore:4099

Isso está em Propriedades-> Linker-> Linha de Comando

Aaron Saarela
fonte
5
Eu não acho que / ignore existe. Os erros ainda estão listados e / ignore não está documentado no MSDN. Estou tentando desativar o 4075 para "aviso LNK4075: ignorando '/ EDITANDCONTINUE' devido à especificação '/ INCREMENTAL: NO'."
Nick Desjardins
1
/ IGNORE não está documentado, mas está disponível. Consulte connect.microsoft.com/VisualStudio/feedback/details/176188/…
Aaron Saarela
5
Não funciona para o aviso 4099 connect.microsoft.com/VisualStudio/feedback/details/176188/…
KindDragon
7
Você pode usar / ignorar: 4099 como um sinalizador de vinculador, mas há um problema. Infelizmente, a Microsoft decidiu tornar o 4099 um aviso não ignorável, então você tem que corrigir o link.exe. Parece meio louco, mas simplesmente não há outra maneira. Mais detalhes aqui: bottledlight.com/docs/lnk4099.html Usei o HxD como um editor hexadecimal e, seguindo a descrição nessa página, funcionou bem com o VS10. O pedido ainda é 4088, 4099, 4105.
Andreas Haferburg
2
Funciona no VS 2015 (o projeto está usando o conjunto de ferramentas VS2013, não tenho certeza se isso faz diferença)
Assimilater
50

Atualização 16/10/2018

Alegadamente, a partir do VS 2013, este aviso pode ser desativado. Veja o comentário de @Mark Ransom.

Resposta Original

Você não pode desativar esse aviso específico.

De acordo com Geoff Chappell, o aviso 4099 é tratado como se fosse muito importante para ser ignorado, mesmo usando em conjunto com / wx (que trataria os avisos como erros e ignoraria o aviso especificado em outras situações)

Aqui está o texto relevante do link:

Avisos não totalmente inadmissíveis

Para alguns números de aviso, a especificação em uma opção / ignore é aceita, mas não necessariamente aplicada. Se o aviso ocorrer enquanto a opção / wx não estiver ativa, a mensagem de aviso ainda será exibida, mas se a opção / wx estiver ativa, o aviso será ignorado. É como se o aviso fosse considerado importante o suficiente para anular uma tentativa de ignorá-lo, mas não se o usuário colocasse um preço muito alto em avisos não ignorados.

Os seguintes números de aviso são afetados:

4200, 4203, 4204, 4205, 4206, 4207, 4208, 4209, 4219, 4231 and 4237
John Weldon
fonte
Ele não diz "o aviso 4099 é importante demais para ser ignorado"; ele infere isso do fato de que não pode ser desligado. (Anotado aqui, já que não há informações extras nesse link.)
Ben M
Atualizado para atender à sua preocupação @BenM
John Weldon
1
Esta resposta é antiga , desativar o aviso 4099 funcionou bem para mim no VS2017. Parece a partir dos comentários aqui que pode ser desativado provavelmente a partir do VS2013.
Mark Ransom
10

(Para registro e antes que o tópico desapareça nos fóruns do msdn) Você não pode desativar o aviso (pelo menos no VS2010) porque ele está na lista de avisos que não podem ser desativados (então / wd4099 não funcionará) , mas o que você pode fazer em vez disso é corrigir o link.exe (geralmente C: \ Arquivos de programas (x86) \ Microsoft Visual Studio 10.0 \ VC \ bin \ link.exe) para removê-lo da lista. Parece uma britadeira, eu sei. Mas funciona.

Por exemplo, se você quiser remover o aviso de 4099, abra link.exe com um editor hexadecimal, vá para a linha 15A0 que lê 03 10 (little endian para 4099) e substitua-o por FF 00 (que não existe).

Gurg Hackpof
fonte
5
Você deve procurar a sequência F8 0F 00 00 - 03 10 00 00 - 09 10 00 00 (4088, 4099, 4105 como palavras duplas de 32 bits em little endian). É o mesmo no amd64 / link.exe.
Andreas Haferburg de
8

Para o benefício de outros, pensei em incluir o que fiz.

Como você não consegue fazer o Visual Studio (2010 no meu caso) ignorar os avisos do LNK4204, minha abordagem foi dar a ele o que ele queria: os arquivos pdb. Como estava usando bibliotecas de código aberto no meu caso, já tenho o código compilando os arquivos PDB.

MAS, o padrão é nomear todos os arquivos PDF da mesma forma: vc100.pdb no meu caso. Como você precisa de um .pdb para cada .lib, isso cria um problema, especialmente se você estiver usando algo como o ImageMagik, que cria cerca de 20 arquivos .lib estáticos. Você não pode ter 20 arquivos lib em um diretório (ao qual o vinculador do seu aplicativo faz referência para vincular nas bibliotecas) e todos os 20 arquivos .pdb são chamados da mesma coisa.

Minha solução foi reconstruir meus arquivos de biblioteca estática e configurar o VS2010 para nomear o arquivo .pdb com relação ao PROJETO. Dessa forma, cada .lib obtém um nome semelhante .pdb, e você pode colocar todos os LIBs e PDBs em um diretório para seu projeto usar.

Portanto, para a configuração "Debug", editei:

Propriedades-> Propriedades de configuração -> C / C ++ -> Arquivos de saída -> Nome do arquivo do banco de dados do programa de

$ (IntDir) vc $ (PlatformToolsetVersion) .pdb

para ser o seguinte valor:

$ (OutDir) vc $ (PlatformToolsetVersion) D $ (ProjectName) .pdb

Agora, em vez de em algum lugar no diretório intermediário, os arquivos .pdb são gravados no diretório de saída, onde os arquivos .lib também estão sendo gravados E, o mais importante, eles são nomeados com um sufixo de nome de projeto D + . Isso significa que cada projeto de biblioteca produz um .lib de projeto e um .pdb específico de projeto.

Agora posso copiar todos os meus arquivos .lib de lançamento, meus arquivos .lib de depuração e os arquivos .pdb de depuração em um único lugar no meu sistema de desenvolvimento, e o projeto que usa essa biblioteca de terceiros no modo de depuração tem o pdb arquivos necessários no modo de depuração.

Minok
fonte
2
Eu diria que esta é a resposta à pergunta. A sugestão de PATCHING THE LINKER que muitas respostas contêm é estúpida. Mesmo que a Microsoft esteja "errada" em tornar este aviso inegável.
Tamás Szelei
3
Esta é a resposta adequada SE você estiver compilando a biblioteca a partir do código-fonte. Mas alguns programas têm dependências de bibliotecas comerciais que não incluem arquivos .pdb, portanto, gerar um arquivo .pdb para eles não é uma opção.
Bryce Wagner
3

Eu suspeito / ignore é uma opção VC6 link.exe. para o vinculador do VS2005 e do VS2008 não há opção documentado / ignorar disponível, mas o vinculador parece apenas ignorar a opção "/ ignore: XXX", sem erro e sem efeito.

zhaorufei
fonte
2
Na verdade, é encorajado não ignorar os avisos do linker, então o sinalizador de ignorar foi desabilitado após VC6: bytes.com/topic/net/answers/…
Gyuri
/ ignore pode ser usado novamente no VS2013.
Fernando Gonzalez Sanchez
1

O arquivo PDB é normalmente usado para armazenar informações de depuração. Este aviso é causado provavelmente porque o arquivo vc80.pdbnão foi encontrado ao vincular o arquivo do objeto de destino. Leia a entrada MSDN sobre LNK4099 aqui .

Como alternativa, você pode desativar a geração de informações de depuração no campo Propriedades do projeto> Vinculador> Depuração> Gerar informações de depuração.

diretamente
fonte
3
Desativar as informações de depuração resolve os avisos do vinculador, mas os pontos de interrupção não funcionam sem as informações de depuração. Isso não é muito útil para mim.
Ashwin Nanjappa
2
Desativar avisos nunca é a coisa certa a fazer. Consertá-los. Você precisa encontrar o pdb e garantir que ele seja copiado para o local apropriado.
dirkgently de
Sigh, isso é verdade! Infelizmente, neste caso, não consigo encontrar esse PDB.
Ashwin Nanjappa
1
vc80.pdb é apenas o nome pdb padrão para vc8. Esse aviso significa simplesmente que não há informações de depuração disponíveis para a biblioteca CGAL. É seguro ignorar.
JoeG,
1

EDIT: não use vc80 / Visual Studio 2005, mas Visual Studio 2008 / vc90 versões da biblioteca CGAL (talvez de aqui ).

Aviso de ferramentas de vinculação LNK4099 :

Você também pode compilar com / Z7, para que o pdb não precise ser usado, ou remova a opção de vinculador / DEBUG se você não tiver arquivos .pdb para os objetos que está vinculando.

machado.
fonte
2
Obrigado. Compilar com / Z7 ainda pede o arquivo .pdb da biblioteca CGAL. / DEBUG resolve os avisos do vinculador, mas os pontos de interrupção não funcionam sem informações de depuração.
Ashwin Nanjappa
1

Você não pode desativar o aviso do vinculador 4099, como disse @John Weldon.

Você deve reconstruir a biblioteca com algumas mudanças na configuração do projeto. Você tem várias opções:

  • Salvar o arquivo PDB com informações de depuração na mesma pasta onde você salvou o arquivo .lib. Defina o valor "$ (OutDir) $ (TargetName) .pdb" para Propriedades-> C / C ++ -> Arquivos de saída-Nome do arquivo do banco de dados do programa
  • Salve as informações de depuração no arquivo .lib. Defina o valor "compatível com C7 (/ Z7)" para Propriedades-> C / C ++ -> Geral-> Formato de informação de depuração
  • Desative a geração de informações de depuração para esta biblioteca. Remova o valor de Propriedades-> C / C ++ -> Geral-> Formato de Informação de Depuração
KindDragon
fonte