2012-07-05 11 views
5

Tengo un proyecto de MSVC++ que consiste en un archivo ejecutable, varias bibliotecas estáticas propias y algunas bibliotecas de terceros estáticas precompiladas. El exe usa enlaces incrementales para acelerar el tiempo de compilación.Exe realiza un enlace completo cuando la Biblioteca cambia, a pesar del enlace incremental

Cuando cambio un archivo .cpp dentro del proyecto ejecutable, compilar + vincular es muy rápido (< 10s).
Sin embargo, cuando cambio un archivo .cpp dentro de una de mis propias bibliotecas, el proyecto ejecutable parece estar haciendo un enlace completo contra cada biblioteca que utiliza.
Ya no estoy tan seguro de si es un enlace completo, pero de las advertencias de enlace "vc90.pdb not found", puedo decir que enlaza con algunas bibliotecas externas que no han cambiado en absoluto.

He aquí un ejemplo de la estructura del proyecto:

  • bibliotecas precompilados de terceros ExtLib1, ExtLib2 y ExtLib3
  • Biblioteca propio MyLib, utilizando lib tercero ExtLib1
  • propia Exe MyExe, utilizando MyLib y ExtLib1-3

Cambio de un archivo .cpp en MyLib conduciría entonces a MyExe estar vinculados a MyLib, ExtLib1, ExtLib2 y ExtLib3, incluso si incremental Vinculación está encendida.

Un enlace completo demora alrededor de 5 minutos en mi proyecto, entonces pregunto: ¿Hay alguna forma de volver a vincular solo la biblioteca modificada?

Respuesta

2

Esta es una introducción a incremental linking. Enumera situaciones que causarán un enlace completo. Uno de ellos es "Se modificó un objeto que se compiló con la opción/Yu/Z7". Compruebe si su MyLib lo atrapó.

+0

Mis bibliotecas están compiladas con/Yu/Zi. Intenté deshabilitar los encabezados precompilados para la biblioteca (es decir,eliminando/Yu) pero no cambió mucho. Tal vez el enlazador está de hecho tratando de hacer un enlace incremental pero vincula casi cualquier cosa. Tendrá que investigar esto más mañana –

1

Cuando una biblioteca estática cambia siempre habrá un enlace completo para el ejecutable, por lo menos en Visual Studio 2013, y es probable que obtener algo como esto en la ventana de salida:

2>Link: 
2> LINK : library changed; performing full link 

buenas noticias : Hice una prueba rápida en Visual Studio 2015 y la vinculación incremental pareció funcionar como se esperaba.

Fuente: mucha experimentación y mirando alrededor, habiendo tenido el mismo problema. Además, esto: http://www.pcreview.co.uk/threads/incremental-linking-and-multiple-projects.1431266/, específicamente:

Esto es por diseño. No podemos vincular incrementalmente cuando cambia una lib estática. Eso nunca fue soportado antes tampoco.

Ronald Laeremans, Visual C++ equipo

Editar - está confirmado que VS 2015 tiene vinculación incremental al utilizar las bibliotecas estáticas: http://blogs.msdn.com/b/vcblog/archive/2014/11/12/speeding-up-the-incremental-developer-scenario-with-visual-studio-2015.aspx.

Cuestiones relacionadas