2010-11-08 17 views
5

Tenemos un gran proyecto que usa VS2008 y aumenta 1_42. Estoy tratando de actualizar a VS2010 y aumentar 1_44. Instalé VS2010 e impulsé 1_44 y convertí el proyecto. Ahora estoy tratando de construir, y todo lo compila, pero falla al enlazar:¿Por qué VisualStudio busca este archivo lib? LNK1104 error

LINK : fatal error LNK1104: cannot open file 'libboost_thread-vc90-mt-1_42.lib'

me han cambiado el include y lib para apuntar a los nuevos archivos impulso 1_44 y he cambiado el nombre del directorio de impulso 1_42 edad .

¿Por qué el enlazador sigue buscando un archivo vc90-1_42, cuando solo está usando 1_44 encabezados? ¿Hay alguna manera de poder determinar POR QUÉ el enlazador quiere este archivo? El enlazador obviamente piensa que necesita el archivo, pero ¿por qué?

He limpiado el proyecto y estoy reconstruyendo para asegurar que se borren los archivos de compilación anteriores.

+0

Bien, entonces descubrí cuál era mi problema, pero aún así me gustaría obtener una respuesta a "¿Cómo puedo averiguar por qué el enlazador quiere este archivo?". Mi proyecto dependía de uno de nuestros archivos lib que se creó con boost 1_42. Recompulsé el archivo lib con boost 1_44, y el error del enlazador en el proyecto principal desapareció. ¿Hay algún registro o utilidad que podría haber usado para ver que estaba sucediendo? – JPhi1618

+0

Estoy bastante seguro de que no hay. Este tipo de información ("need to link to some_lib") probablemente esté enterrada en el interior de los archivos generados obj y lib. –

Respuesta

3

Junto con cambiar el directorio lib, debe cambiar el nombre de la biblioteca de impulso. Eso está en Linker | Sección de entrada de la configuración del proyecto.

Su comentario agregado deja en claro que la dependencia de la biblioteca Boost 1.42 estaba siendo creada indirectamente por otra biblioteca que no se había reconstruido.

Para esto, básicamente tiene dos opciones: agregar esa biblioteca como proyecto a su solución principal, y asegurarse de que tenga suficiente información de dependencia que se reconstruirá cuando actualice Boost, o use el compilador /Zl cambiar cuando construyes tu biblioteca Esto le dice al compilador que está construyendo una biblioteca, de modo que haga y no desea incrustar dependencias de biblioteca como esta.

+2

Boost usa el enlace automático, por lo que no enumero manualmente todos los archivos en la sección Enlazador | Entrada. – JPhi1618

0

Boost utiliza

#pragma comment(lib) 

comando para informar al enlazador de bibliotecas que necesita para enlazar con. No es un error. Si Boost dice que lo necesitas, es probable que lo hagas.

+0

Estoy diciendo que es un error porque no hay razón para que el impulso 1_44 necesite un impulso 1_42 archivo lib. – JPhi1618

+0

Puede haber un error en Boost, pero lo dudo. –

+0

Creo que Jerry Coffin tiene razón. Es probable que tenga una dependencia de alguna otra biblioteca (hecha en casa o no) que depende de boost 1.42. De ahí el problema de vinculación automática que estás experimentando. –

5

Me he topado exactamente con este problema un par de veces también. Por lo general, han sido algunos archivos temporales antiguos, pero como en su caso, la limpieza no siempre solucionó el problema de inmediato. ¿Su proyecto incluye cualquier biblioteca estática que pueda haberse creado con 1.42?

Algo puede probar que puede o no puede ser útil en la búsqueda de su problema: Cambie el nombre del directorio de impulso vieja de nuevo a su nombre original

  • Limpiar la solución
  • marco de la C/C++ -> comando Line-> Opciones adicionales añadir "/" showIncludes
  • Bajo Linker-> comando de línea> Opciones adicionales añadir "/ verbose: lib"
  • reconstruir todos

Luego, cuando construya, podrá ver en qué punto se incluyen los encabezados 1.42, etc., en la ventana de resultados. De alguna manera, hacer esto me ayudó a rastrear dónde estaba el problema.

0

Encendido ¿Cómo puedo averiguar por qué el enlazador quiere este archivo?

Hay programas que van a pasar por su aplicación y dlls/libs e informar el contenido de los manifiestos y lo que informan los binarios de la que dependen. Luego puede escanear el informe para las bibliotecas inesperadas que se incluyen. Usamos esto principalmente para encontrar libs, incluida la versión anterior del tiempo de ejecución de VC.

No he usado el que teníamos en unos 5 años sin embargo, ahora solo si pudiera recordar el nombre de la aplicación!

DependancyWalker (depends.exe) le permitirá ver dependencias de dll/exe pero no libs estáticas.

Puede abrir cada archivo binario como un 'archivo' en MSVS y ver el contenido del manifiesto a mano, pero la imagen de esto sería un poco doloroso. No he intentado esto con una lib estática.

Cuestiones relacionadas