Visual C ++: ¿Cómo deshabilitar las advertencias específicas del vinculador?

118

Estoy usando una biblioteca de CGAL que durante la etapa de vinculación de mi compilación de código produce muchas advertencias de vinculación de esta forma:

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

¿Cómo desactivo esta advertencia específica del vinculador en Visual C ++ / Studio 2008?

Tenga en cuenta que no tengo ningún control sobre la biblioteca externa (CGAL) que estoy usando. No puedo / no quiero volver a compilar la biblioteca externa. De ahí la necesidad de arreglar los mensajes de mi parte.

Ashwin Nanjappa
fuente
1
Para VS2005 / ignore: 4099 funciona bien.
/ ignorar: 4099 funciona bien aquí con VS2008.
Tom
/ignore:4099funciona bien en Visual Studio 10 con C ++. Recibí la advertencia LNK4099: PDB 'vc100.pdb' was not found with 'gtest_main-mdd.lib(gtest_main.obj)y logré eliminarla de esta manera.
Manolete
3
VS2013 acepta / ignora: 4099 muy bien :)
mlvljr

Respuestas:

101

Agregue lo siguiente como una opción de vinculador adicional:

 /ignore:4099

Esto está en Propiedades-> Vinculador-> Línea de comandos

Aaron Saarela
fuente
5
No creo que exista / ignorar. Los errores todavía se enumeran y / ignore no está documentado en MSDN. Estoy intentando desactivar 4075 para "advertencia LNK4075: ignorando '/ EDITANDCONTINUE' debido a la especificación '/ INCREMENTAL: NO'".
Nick Desjardins
1
/ IGNORE no está documentado pero está disponible. Consulte connect.microsoft.com/VisualStudio/feedback/details/176188/…
Aaron Saarela
5
No funciona para la advertencia 4099 connect.microsoft.com/VisualStudio/feedback/details/176188/…
KindDragon
7
Puede usar / ignorar: 4099 como una bandera del enlazador, pero hay una trampa. Desafortunadamente, Microsoft decidió convertir 4099 en una advertencia no ignorable, por lo que debe parchear el link.exe. Suena un poco loco, pero simplemente no hay otra manera. Más detalles aquí: bottledlight.com/docs/lnk4099.html Usé HxD como editor hexadecimal, y seguir la descripción en esa página funcionó bien con VS10. El pedido sigue siendo 4088, 4099, 4105.
Andreas Haferburg
2
Funciona en VS 2015 (el proyecto está utilizando el conjunto de herramientas VS2013, no estoy seguro de si eso marca la diferencia)
Assimilater
50

Actualización 2018-10-16

Según se informa, a partir de VS 2013, esta advertencia se puede desactivar. Vea el comentario de @Mark Ransom.

Respuesta original

No puede desactivar esa advertencia específica.

Según Geoff Chappell, la advertencia 4099 se trata como si fuera demasiado importante para ignorarla, incluso si se usa junto con / wx (que trataría las advertencias como errores e ignoraría la advertencia especificada en otras situaciones)

Aquí está el texto relevante del enlace:

Advertencias no del todo irrelevantes

Para algunos números de advertencia, se acepta la especificación en una opción / ignore pero no necesariamente se actúa en consecuencia. Si la advertencia ocurre mientras la opción / wx no está activa, el mensaje de advertencia todavía se muestra, pero si la opción / wx está activa, la advertencia se ignora. Es como si la advertencia se considerara lo suficientemente importante como para anular un intento de ignorarla, pero no si el usuario ha puesto un precio demasiado alto a las advertencias no ignoradas.

Los siguientes números de advertencia se ven afectados:

4200, 4203, 4204, 4205, 4206, 4207, 4208, 4209, 4219, 4231 and 4237
John Weldon
fuente
No dice "la advertencia 4099 es demasiado importante para ignorarla"; infiere esto del hecho de que no se puede apagar. (Se indica aquí porque no hay información adicional en ese enlace)
Ben M
Actualizado para abordar su preocupación @BenM
John Weldon
1
Esta respuesta es antigua , la advertencia de desactivación 4099 funcionó bien para mí en VS2017. A partir de los comentarios aquí, parece que se puede deshabilitar probablemente comenzando con VS2013.
Mark Ransom
10

(Para el registro y antes de que el hilo desaparezca en los foros de msdn) No puede deshabilitar la advertencia (al menos en VS2010) porque está en la lista de advertencias que no se pueden deshabilitar (por lo que / wd4099 no funcionará) , pero lo que puede hacer en su lugar es parchear link.exe (generalmente C: \ Archivos de programa (x86) \ Microsoft Visual Studio 10.0 \ VC \ bin \ link.exe) para eliminarlo de dicha lista. Suena como un martillo neumático, lo sé. Aunque funciona.

Por ejemplo, si desea eliminar la advertencia para 4099, abra link.exe con un editor hexadecimal, vaya a la línea 15A0 que dice 03 10 (little endian para 4099) y reemplácelo con FF 00 (que no existe).

Gurg Hackpof
fuente
5
Debería buscar la secuencia F8 0F 00 00 - 03 10 00 00 - 09 10 00 00 (4088, 4099, 4105 como palabras dobles de 32 bits en little endian). Es lo mismo en amd64 / link.exe.
Andreas Haferburg
8

Para el beneficio de otros, pensé que incluiría lo que hice.

Como no puede hacer que Visual Studio (2010 en mi caso) ignore las advertencias de LNK4204, mi enfoque fue darle lo que quería: los archivos pdb. Como estaba usando bibliotecas de código abierto en mi caso, ya tengo el código que crea los archivos pdb.

PERO, el nombre predeterminado es nombrar todos los archivos PDF de la misma manera: vc100.pdb en mi caso. Como necesita un .pdb para todos y cada uno de los .lib, esto crea un problema, especialmente si está utilizando algo como ImageMagik, que crea alrededor de 20 archivos .lib estáticos. No puede tener 20 archivos lib en un directorio (al que hace referencia el enlazador de su aplicación para enlazar en las bibliotecas) y tener todos los 20 archivos .pdb llamados de la misma manera.

Mi solución fue reconstruir mis archivos de biblioteca estática y configurar VS2010 para nombrar el archivo .pdb con respecto al PROYECTO. De esta manera, cada .lib obtiene un .pdb con un nombre similar, y puede poner todos los LIB y los PDB en un directorio para que los utilice su proyecto.

Entonces, para la configuración de "Depuración", edité:

Propiedades-> Propiedades de configuración -> C / C ++ -> Archivos de salida -> Nombre de archivo de base de datos de programa de

$ (IntDir) vc $ (PlatformToolsetVersion) .pdb

ser el siguiente valor:

$ (OutDir) vc $ (PlatformToolsetVersion) D $ (Nombre del proyecto) .pdb

Ahora, en lugar de en algún lugar del directorio intermedio, los archivos .pdb se escriben en el directorio de salida, donde también se escriben los archivos .lib, Y lo más importante, se nombran con un sufijo de nombre de proyecto D + . Esto significa que cada proyecto de biblioteca produce un .lib de proyecto y un .pdb específico del proyecto.

Ahora puedo copiar todos mis archivos .lib de lanzamiento, mis archivos .lib de depuración y los archivos .pdb de depuración en un solo lugar en mi sistema de desarrollo, y el proyecto que usa esa biblioteca de terceros en modo de depuración, tiene el pdb archivos que necesita en modo de depuración.

Minok
fuente
2
Yo diría que esta es la respuesta a la pregunta. La sugerencia de PATCHING THE LINKER que contienen muchas respuestas es estúpida. Incluso si Microsoft está "equivocado" al hacer que esta advertencia sea imperdible.
Tamás Szelei
3
Esta es la respuesta adecuada SI está compilando la biblioteca desde la fuente. Pero algunos programas tienen dependencias de bibliotecas comerciales que no incluyen archivos .pdb, por lo que generar un archivo .pdb para ellos no es una opción.
Bryce Wagner
3

Sospecho / ignorar es una opción de link.exe de VC6. para el enlazador VS2005 y VS2008 no hay una opción documentada / ignorar disponible, pero el enlazador parece simplemente ignorar la opción "/ ignorar: XXX", sin error ni efecto.

Zhaorufei
fuente
2
De hecho, es recomendable no ignorar las advertencias del enlazador, por lo que la bandera de ignorar se deshabilitó después de VC6: bytes.com/topic/net/answers/…
Gyuri
/ ignore se puede usar nuevamente en VS2013.
Fernando Gonzalez Sanchez
1

El archivo PDB se utiliza normalmente para almacenar información de depuración. Esta advertencia se debe probablemente a que el archivo vc80.pdbno se encuentra al vincular el archivo de objeto de destino. Lea la entrada de MSDN en LNK4099 aquí .

Alternativamente, puede desactivar la generación de información de depuración desde el campo Propiedades del proyecto> Vinculador> Depuración> Generar información de depuración.

dirkgently
fuente
3
Desactivar la información de depuración resuelve las advertencias del vinculador, pero los puntos de interrupción no funcionan sin información de depuración. Eso no es muy útil para mí.
Ashwin Nanjappa
2
Desactivar las advertencias nunca es lo correcto. Arreglalos. Debe encontrar el pdb y asegurarse de que se copie en la ubicación adecuada.
dirkgently
¡Suspiro, eso es cierto! Lamentablemente, en este caso, no puedo encontrar ese archivo pdb.
Ashwin Nanjappa
1
vc80.pdb es solo el nombre pdb predeterminado para vc8. Esta advertencia simplemente significa que no hay información de depuración disponible para la biblioteca CGAL. Es seguro ignorarlo.
JoeG
1

EDITAR: no use vc80 / Visual Studio 2005, sino versiones de Visual Studio 2008 / vc90 de la biblioteca CGAL (tal vez desde aquí ).

Advertencia de las herramientas del vinculador LNK4099 :

También puede compilar con / Z7, por lo que no es necesario utilizar pdb, o eliminar la opción del vinculador / DEBUG si no tiene archivos .pdb para los objetos que está vinculando.

hacha.
fuente
2
Gracias. La compilación con / Z7 todavía solicita el archivo .pdb de la biblioteca CGAL. / DEBUG resuelve las advertencias del vinculador, pero los puntos de interrupción no funcionan sin información de depuración.
Ashwin Nanjappa
1

No puede deshabilitar la advertencia 4099 del vinculador, como dijo @John Weldon.

Debería reconstruir la biblioteca con algunos cambios de configuración del proyecto. Tienes varias opciones:

  • Guardar archivo PDB con información de depuración es la misma carpeta donde guarda el archivo .lib. Establezca el valor "$ (OutDir) $ (TargetName) .pdb" en Propiedades-> C / C ++ -> Archivos de salida-Nombre de archivo de base de datos del programa
  • Guarde la información de depuración en un archivo .lib. Establezca el valor "Compatible con C7 (/ Z7)" en Propiedades-> C / C ++ -> General-> Formato de información de depuración
  • Deshabilite la generación de información de depuración para esta biblioteca. Eliminar valor de Propiedades-> C / C ++ -> General-> Formato de información de depuración
TipoDragon
fuente