2011-02-03 20 views
5

He tropezado con un problema aparentemente simple al crear dos bibliotecas y probar programas para ambas.Dependencias transitorias para bibliotecas estáticas y SCons

El problema: tengo dos bibliotecas estáticas, libA y libB, y libB depende de libA. No deseo vincular explícitamente todos los programas que usan libB a libA, quiero que SCons vea que si un programa se vincula a la biblioteca B también debe vincularse a la biblioteca A.

He creado un ejemplo simple que ilustra este problema. Como no podía encontrar un proveedor de alojamiento de archivos adecuado y esta es la programación relacionada, he creado un pequeño repositorio SVN:

svn checkout https://example-repository.googlecode.com/svn/trunk example-repository 

o puede descargar un archivo comprimido here.

Respuesta

4

SCons no tiene soporte integrado para expresar dependencias de biblioteca transitiva como usted describe, pero su primo más joven Waf sí lo tiene. Consulte documentation para la función "usar" en el libro Waf. El Boost build system también tiene esta característica under a different name. También puede elegir implementarlo usted mismo en SCons si está dispuesto a codificar un poco de Python.

Un truco que puede utilizar es la capacidad de definir las devoluciones de llamada como variables de construcción (es decir, cadenas que se expandirán mediante una llamada de función Python). Haga que la llamada a función calcule la lista transitiva de bibliotecas que necesita según algún tipo de gráfico de dependencia que calcule en tiempo de análisis (es decir, a través de llamadas a métodos encontradas en SConscripts), y no tendrá que repetir la lista completa de bibliotecas para cada objetivo o ambiente

+0

+1 enlace de interés Veré el manual del waf, pero por lo que veo, esta puede ser una buena opción. Por otro lado, ya comencé a implementar algunos constructores personalizados con SCons ... – hochl

+0

Mi solución actual crea un gráfico de dependencia basado en archivos de configuración adicionales que contienen información de dependencia, ya que no encontré otra forma de obtener dependencias entre compilación objetivos dinámicamente – hochl

0

¿Qué son libB y libA? ¿Son libs que son una gran .o o están formadas por varios archivos .o?

Si las libs son múltiples archivos .o y está llamando a una función en uno de los archivos .o de libB que utiliza uno de los archivos .o de libA, obtiene el .o del libB y el libA .o dependiente. Si está utilizando una función en un archivo libB .o que no depende de nada de libA, solo obtendrá el archivo libB .o en su archivo binario.

Por lo tanto, si usted tiene el comando:

cc -o a.out a.c libA.a libB.a 

sólo obtendrá las piezas necesarias tanto libB y Liba.

+0

Simplemente contienen archivos de objetos simples, como se puede ver en el tarball de ejemplo (ver el enlace al final de la publicación). – hochl

Cuestiones relacionadas