2011-01-28 13 views
7

Tengo una aplicación que necesita utilizar cierta API C++ de código cerrado. Esta API se distribuye con algunos bits de Boost, archivos de bibliotecas binarias y todo. Me gusta usar Boost en mi propio código. No puedo usar su versión de Boost ya que no distribuyeron todas las partes de Boost que necesito. ¿Cómo debo proceder? La plataforma objetivo es Linux, eventualmente Windows también.boost distribuido con la biblioteca de código cerrado

  • No pasaré objetos Boost a través del límite API.
  • puedo compilar las cosas a los archivos de objetos de manera que mi código utiliza mis cabeceras de impulso, y el código de la API utiliza sus cabeceras de Boost. Esta parte parece directa.
  • Lo que No get: cómo enlacemi código a mis archivos de la biblioteca Boost, y el código de API para sus archivos de la biblioteca Boost. ¿Necesito compilar mi propia envoltura alrededor de la API? ¿Una envoltura cuyos encabezados hacen no incluyen Boost - a una biblioteca dinámica? (Esta es la única forma en que se me ocurre hacer los enlaces. Los símbolos en los archivos de la biblioteca Boost de la API deben ser idénticos a los símbolos en los archivos de la biblioteca Boost. I tienen para hacer el enlace en dos etapas, ¿no? La única forma en que puedo vincular una parte del programa sin el resto es crear una biblioteca dinámica, ¿no?)
+1

También tengo que trabajar con la biblioteca de código fuente de un tercero. Distribuyeron su propia versión (realmente antigua) de Boost con la biblioteca. Afortunadamente, cambiaron el nombre de su biblioteca de Boost, como 'BoostSystem_x86-64_redhat_gcc41_mdi' en lugar de' boost_system'. De alguna manera, mi código realmente se construye. – chrisaycock

+1

ver http://stackoverflow.com/questions/2907882/using-concurrently-2-versions-of-boost – KitsuneYMG

+0

@chrisaycock ¿Estás usando Activ? ¡Tengo el mismo nombre de archivo! Pero sospecho que los símbolos en ese archivo tienen el mismo nombre que los de mi versión de boost, lo que significa que mi Boost se vinculará al impulso de Activ ... @KitsuneYMG Todavía no he recibido una respuesta a este problema de vinculación ... (incluso si funciona, tengo un poco de miedo de esperar que siga funcionando ...) – Scott

Respuesta

0

Si solo está utilizando las bibliotecas de impulso de solo cabecera, puede simplemente construir su código por separado del código que enlaza con las otras bibliotecas.

¿Qué bibliotecas de impulso está utilizando?

+1

Encabezado solo o no, esto es solo para violar el ODR, ya que las diferentes versiones de Boost tendrá diferentes definiciones de varios tipos y funciones, ambos en el espacio de nombres 'boost'. – ildjarn

1

Un ejecutable dado solo puede tener una pieza de código para cada símbolo. Entonces, si su biblioteca usa el símbolo foo de boost v. 1 y usa el mismo símbolo de boost v. 2, entonces obtendrá un choque. No hay una manera fácil de deshacerse de este choque sin cambiar el símbolo. Debería ser posible usar la ejecución dinámica si pudieras compilar el código de impulso en un dynamic library, pero parece que sería excesivo.

Dado que, en C++, un símbolo se destroza con su clase/espacios de nombres, también puede cambiar uno de estos para obtener el símbolo para cambiar.

0

¿Cómo se relaciona la API con la biblioteca de impulso que usaron? Implementan un impulso - ##. ¿Entonces con eso, o era un enlace estático?

Por lo tanto, ejecute "objdump -T api.so | grep boost" en su api .so para comprobar si la API expone el Boost.

Además, es posible que hayan cambiado el nombre del espacio de nombres de impulso como el usuario chrisaycock mencionado. Utilice el comando C++ filt para ver de cerca los símbolos que encontró con "objdump -T api.so | grep boost".

Si se enlazó estáticamente y los símbolos de impulso no se expusieron (o se cambiaron de nombre), entonces puede usar impulsar en su código sin importar el impulso de la API.

Si el impulso está realmente expuesto, le recomiendo que intente usar el impulso. Para su código usando boost, probablemente un choque no ocurrirá. Si sucede, puede compilar un nuevo impulso y cambiar su nombre de espacio de nombres. Simplemente ejecute un script de reemplazo que reemplace "boost de namespace" por algo como "namespace boost_1_46".

Cuestiones relacionadas