2011-01-19 38 views
18

En MS Visual C++ 2010Cómo vincular Boost en una biblioteca estática dependiente

Tenía un único proyecto C++ en mi solución que utilizaba boost y funcionaba perfectamente.

Luego decidí convertir este proyecto en una biblioteca estática y crear un nuevo proyecto que depende de esta biblioteca estática.

Ahora, mi biblioteca estática convertida crea sin errores y advertencias (compilador y vinculador) pero el nuevo proyecto compila pero no enlaza.

que estoy recibiendo:

1>LINK : fatal error LNK1104: cannot open file 'libboost_thread-vc100-mt-1_45.lib' 

Como prueba añadí la ruta completa a las opciones del vinculador para esta biblioteca ... y luego se quejó de

1>LINK : fatal error LNK1104: cannot open file 'libboost_date_time-vc100-mt-1_45.lib' 

Ahora he añadido complete las rutas a todas las bibliotecas y ahora se compila y ejecuta.

No estoy feliz con esta solución porque:

  1. no quiero que los usuarios de la biblioteca para tiene que preocuparse acerca de la vinculación en impulso.
  2. Es desordenado

Sé que una respuesta sería la creación de un archivo DLL, pero hay una manera de hacer esto de forma estática y mantener la vinculación a mi nivel biblioteca estática.

Editar:

Si le digo al enlazador .exe hacer caso omiso de las librerias a impulsar de manera explícita entonces todo está bien, excepto el .exe no debería tener que preocuparse por impulso en absoluto.

/NODEFAULTLIB:"libboost_thread-vc100-mt-1_45.lib" /NODEFAULTLIB:"libboost_date_time-vc100-mt-1_45.lib" 

Respuesta

24

Aparentemente no necesita las .libs, ya que su ejecutor también las enlaza sin ellas. Parece que estás usando clases y métodos de solo encabezado boost. Así que solo dile boost para deshabilitar el enlace automático definiendo el símbolo del preprocesador BOOST_ALL_NO_LIB en tu proyecto.

Si desea hacer su .lib innecesaria grande mediante la inclusión de todos impulso, esta pregunta parece tener una respuesta (que en realidad nunca probé a mí mismo): Linking static libraries to other static libraries

+1

Esta respuesta me llevó a una solución correcta. Definí BOOST_ALL_NO_LIB y agregué manualmente las bibliotecas de impulso estático al Bibliotecario. Mi proyecto .exe ahora no necesita saber acerca de BOOST, que era el objetivo. Es una pena que el enlace BOOST automático parezca propagarse a través de DefaultLibs. – T33C

+0

Nota especial para 'Boost.Thread' Puede necesitar usar la opción' BOOST_THREAD_USE_LIB'. Ver http://shoddykid.blogspot.in/2008/07/getting-started-with-boost.html –

+1

Tengo el mismo problema ... Lo resolví usando el preprocesador BOOST_ALL_NO_LIB y enlazando explícitamente libs en mi proyecto agregando el directorio de boost libs y agregue las únicas librerías usadas a Linker-> Input-> Aditional Dependencies. De forma predeterminada, los encabezados de impulso montan el nombre de libs en el encabezado . Esto se puede verificar con el uso del preprocesador BOOST_LIB_DIAGNOSTIC. –

4

Al construir su biblioteca, puede incluir las bibliotecas de impulso en la suya. Para hacerlo, en la página de propiedades de VisualStudio Librarian > General, enumere sus bibliotecas de impulso como Additional Dependencies.

Sin embargo, puede haber un problema si sus clientes usan boost ellos mismos, y están vinculados de forma estática (especialmente una versión diferente a la que está usando).

+0

Sí, vi esta opción, pero no puedo haz que funcione Aumenté la salida del enlazador a verboso y veo que el proyecto .lib se vincula con los archivos .obj de impulso y las búsquedas .exe y encuentra las libs de impulso y luego intenta vincularlas. – T33C

+0

¿Se puede publicar la salida de compilación detallada (al compilar la biblioteca)? Las bibliotecas de impulso deberían estar en su línea de comando de lib. Como se indica en http://msdn.microsoft.com/en-us/library/e17b885t(v=VS.100).aspx, 'LIB crea una biblioteca que contiene todos los objetos en los archivos especificados. Por lo tanto, cuando su .exe se vincula a su biblioteca, no debería requerir impulso (a menos que incluya aumentar los archivos de encabezado público de su biblioteca). –

+1

+1 Gracias Daniel, el problema parece estar en la forma en que INCREMENTO los enlaces automáticos en las bibliotecas. Se ven como defaultlibs y estos se propagan junto con los tiempos de ejecución. Definir BOOST_ALL_NO_LIB y vincular las bibliotecas de impulso en mis trabajos .lib. – T33C

1

¿Ha creado una biblioteca de impulso? Hay ciertas bibliotecas en Boost que deben compilarse. En caso de que no lo haya hecho, consulte "Getting started in Windows" sobre cómo crear la biblioteca de Boost.

EDIT-1: Boost se puede construir como una biblioteca estática y cargable dinámicamente (dll).

EDIT-2: Si ya ha creado Boost, entonces la respuesta de @Daniel Gehriger le dice cómo agregarlo en VS.

+0

Gracias, pero por favor lea mi pregunta nuevamente. He creado boost y puedo enlazar con OK. No quiero que el proyecto .exe tenga que enlazar para aumentar solo .lib – T33C

Cuestiones relacionadas